2013-04-11 4 views
1

EclipseLink 2.3.2의 Glassfish 3.1.2.2에서 JPA 응용 프로그램을 작성하고 있습니다. 나는 컨테이너 관리의 EntityManager (@PersistenceContextjee:jndi-lookup를 통해 컨테이너에 의해 스프링에 의해 주입하지만, 생성)JPA/JTA 응용 프로그램에서 EclipseLink 배치 쓰기가 작동하지 않습니다.

나는이 persistence.xml에 JDBCeclipselink.jdbc.batch-writing을 설정하고 예상대로 작동하지 않습니다와 함께뿐만 아니라, 스프링 MVC를 사용하고 있습니다.

내 코드는 객체

UserTransaction tx = ...; 
tx.begin(); 
for (MyObject obj : list) { 
    entityManager.persist(obj); 
} 
tx.commit(); 

일괄 쓰기의 무리를 작성하는 비교적 간단한 루프를 가지고 하지 그래도 난 방법 주위에 @Transactional 주석 UserTransaction을 교체하는 경우 일!

나는 각이 지속 생성 작업의 별도의 단위를 참조 전화 :

FINER: client acquired: 3418589 
FINER: TX binding to tx mgr, status=STATUS_ACTIVE 
FINER: acquire unit of work: 11053522 
FINEST: persist() operation called on: [email protected] 
.... 
FINER: client acquired: 23361578 
FINER: TX binding to tx mgr, status=STATUS_ACTIVE 
FINER: acquire unit of work: 17636998 
FINEST: persist() operation called on: [email protected] 

DB를 작업을 실제로 할 때까지 실행되지 않는 예상대로 커밋 -하지만 각 작업 단위는 자신의 배치를 가지고 :

FINER: TX beforeCompletion callback, status=STATUS_ACTIVE 
FINER: begin unit of work commit 
FINER: TX beginTransaction, status=STATUS_ACTIVE 
FINEST: Execute query InsertObjectQuery([email protected]) 
FINEST: Connection acquired from connection pool [default]. 
FINEST: Execute query 
FINER: Begin batch statements 
FINE: INSERT INTO .... 
FINE: bind => [24 parameters bound] 
FINER: End Batch Statements 

내가 누락 된 아이디어가 있습니까? 나는 문제의 뿌리가 지속 당 하나의 작업 단위라고 생각한다. 내가 할

참고은 하나의 지속을 통해 하나의 작업 단위 내에서, 캐스케이드 아이 엔티티에 대한 배치 작업을 참조하십시오. 그러나 각 부모/자식 집합은 별도의 일괄 처리가됩니다.

+0

사용중인 JDBC 드라이버는 일괄 쓰기를 지원합니까? –

+0

오라클. JDBC를 직접 (JPA를 통하지 않고) 사용하면 JDBC 드라이버가 지원됩니다. – wrschneider

+0

또한 편집 – wrschneider

답변

0
  • 오라클의 경우 persistence.xml에서 구성 해 볼 수 있습니다. 문서에서

    <property name="eclipselink.jdbc.batch-writing" value="Oracle-JDBC"/>

    :

    오라클 JDBC : 오라클 플랫폼의 기본 배치 작성을 사용합니다. 특성 맵에서 OracleJDBC를 사용하십시오.

    참고 : Oracle JDBC 드라이버가 필요합니다.

  • 그렇지 않으면 속성을 통해 구성 할 수도 있습니다. 일괄 기입과 함께

propertyMap.put(PersistenceUnitProperties.BATCH_WRITING, BatchWriting.OracleJDBC);

, 배치 크기를 지정할 eclipselink.jdbc.batch-writing.size을 가질 수있다.

0

당신은 자바 EE 거래와 봄 거래를 혼합 것 같다 [포스트 나는 봄에 많이 익숙하지 오전는 EclipseLink 고유의 것입니다]. 둘 중 하나를 사용해야합니다.

JTA를 사용하려면 지속성을 구성해야합니다.xml을 사용하여 JTA를 사용하고 "eclipselink.target-server"를 올바르게 설정했는지 확인하십시오 (Glassfish에서 액세스하는 경우 기본적으로 설정되지만 Spring에서 액세스하면 기본적으로 설정되지 않습니다).

+0

persistence.xml은 이미 JTA를 사용하도록 설정되었습니다. eclipselink.target-server가 이미 설정되었습니다. 그리고 Spring은' '를 사용하도록 구성되어있어서 Spring @ Transactional 주석은 여전히 ​​JTA 트랜잭션을 사용하고있었습니다. – wrschneider

관련 문제