EclipseLink 2.3.2의 Glassfish 3.1.2.2에서 JPA 응용 프로그램을 작성하고 있습니다. 나는 컨테이너 관리의 EntityManager (@PersistenceContext
이 jee:jndi-lookup
를 통해 컨테이너에 의해 스프링에 의해 주입하지만, 생성)JPA/JTA 응용 프로그램에서 EclipseLink 배치 쓰기가 작동하지 않습니다.
나는이 persistence.xml에 JDBC
에 eclipselink.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
내가 누락 된 아이디어가 있습니까? 나는 문제의 뿌리가 지속 당 하나의 작업 단위라고 생각한다. 내가 할
참고는은 하나의 지속을 통해 하나의 작업 단위 내에서, 캐스케이드 아이 엔티티에 대한 배치 작업을 참조하십시오. 그러나 각 부모/자식 집합은 별도의 일괄 처리가됩니다.
사용중인 JDBC 드라이버는 일괄 쓰기를 지원합니까? –
오라클. JDBC를 직접 (JPA를 통하지 않고) 사용하면 JDBC 드라이버가 지원됩니다. – wrschneider
또한 편집 – wrschneider