2012-02-29 3 views
2

일괄 처리로 쿼리를 실행하는 JPA 솔루션 (공급 업체 독립적)을 찾고 있습니다. 스레드의 안전성뿐만 아니라 성능을 향상시키는 것이 과제입니다.JPA 2.0 : 일괄 쿼리, 안전 및 성능?

예 쿼리 :

Query query = em.createQuery("select e from Entity e where e.property in :list"); 

목록 따라서 1 385000. 간의 크기의 집합으로 배치 요건이 조회된다.

최초의 순진한 접근법은 원래 목록에서 하위 목록을 가져와 완료 될 때까지 반복하는 것이 었습니다. 이것은 공연자가 아니 었음을 제외하고는 안전하고 잘 작동했습니다.

두 번째 방법은 임시 테이블 위에 목록에서 모든 (유 영구하지만 임시 테이블로 사용)을 넣은 다음 원래 쿼리를 사용하여 임시 테이블에 가입했다. 이것은 확실히 성능이 뛰어나지 만, 각 일괄 처리 후에 임시 테이블을 지우고 임시 테이블에 그 스레드 ID 나 그 종류의 것을 가지고 있지 않아도 안전하지 않습니다 (현재는 안전하지 않습니다).

난 정말이 문제를 해결하기 위해 확대됨과 안전한 방법에 도달하기 위해 제안을 부탁드립니다. 그것은 선택 조항이 없기 때문에

감사

모든
+0

업체 : select e from Entity e, TempEntity temp where e.property = temp.property and temp.uuid = :uuid

  • (반드시 필요하지 않음) 임시 테이블의 모든 행을 삭제하기 위해 질의를 실행 등의 발생 UUID
  • 로 설정 UUID 열은 쿼리를 실행할 독립성은 사용자가 제시 한 JPQL이 아니기 때문에 쿼리를 변경 ("SELECT e"를 추가)하는 것을 의미합니다. 엔티티 클래스 게시. – DataNucleus

  • +0

    감사합니다. 질의를 조금이라도 끝내면 수정되어 수정 될 것입니다. – JProgrammer

    답변

    2

    첫째, 쿼리, 유효 JPQL하지 않습니다.

    둘째, where e.property in (:list)이어야합니다.

    임시 테이블을 채우는 전략이 저에게 잘 보입니다. 와,

    • 테이블에서 목록의 모든 요소를 ​​삽입 UUID를 생성 : 당신은 그냥 추가로 UUID 열을 포함 할 수 있도록, 새로운 UUID 당신이 이러한 쿼리를 수행 할 때마다 생성 할 수 delete from TempEntity temp where temp.uuid :uuid
    +0

    많은 감사드립니다. 나는 UUID에 대해 생각해 보았다. :) – JProgrammer

    +0

    "in : list", "in (: list)"은 하나의 요소가있는 목록, 즉 "in (: arg1, : ag2) "는 arg가 4 인 경우"in (: arg1) "=>"in (4) "의 두 요소가있는 목록입니다. – James

    +0

    @James : 맞습니다. 나는 Hibernate에 익숙하다. 최근까지, Hibernate JPQL 쿼리에서는 괄호가 필수적이었다. https://hibernate.onjira.com/browse/HHH-5126을 참조하십시오. –