2014-02-17 4 views
2

JPA 프레임 워크를 사용하여 일부 데이터베이스 작업을 수행하고 있습니다. 모든JPA EntityManager 제한 DB의 동시 작업 수

먼저 나는 EntityManager 객체를 만든 다음 나는 코드

"entityManager.persist(specificEntity)" 

을 사용하여 특정 테이블에 대한 엔티티 객체를 저장하고이 작업이 annotaion과 방법에서 수행되는 유지

"@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)" 

그 방법에서 for 루프를 사용하여 많은 양의 데이터를 유지하려고 시도하고 모든 데이터가 하나의 트랜잭션에서 유지됩니다. 는 일반적으로 모든 것이 잘 작동하지만 내가 행을 많이 유지하려고 할 때, 나는

"Out of operation records in transaction coordinator (increase MaxNoOfConcurrentOperations)" 

내 DB는 약 32,000 개의 동시 작업을 지원 문제 및 오류에 직면 해있다. JPA 프레임 워크에서 최대 동시 작업 수를 지정하는 방법이 있습니다.

+0

이 문제를 처리하는 한 가지 방법은 페이지 매김을 사용하는 것입니다. "Requires_New trancsaction"이있는 다른 방법이 있습니다. 내 첫 번째 메소드에서 특정 행을 수집 한 다음 해당 객체를 두 번째 메소드로 전달하고 데이터를 지속합니다. 하지만이 코드는 수동으로 처리해야합니다. JPA 프레임 워크가이 문제를 처리 할 수있는 방법이 있는지 알고 싶습니다. – kaka

+0

이 문제를 해결할 필요가 없습니다. JPA의 책임을 맡지 마십시오. DBMS의 한계를 넘지 않도록해야합니다. 즉, 일괄 적으로 거래를 축소해야합니다. – Gimby

답변

2

엔티티를 루프 내에 만들고 EntityManagers FlushModeType이 COMMIT로 설정되어 있다고 가정합니다. 즉, EM이 데이터베이스에 레코드를 보내거나 삽입 할 때까지 트랜잭션 커밋을 기다리는 것을 의미합니다.

EM 최대 작업 수 값을 넣을 수 있더라도 AS가 한 트랜잭션에서 수만 개의 엔티티 삽입을 처리하는 (최악의 경우 : 트랜잭션 데이터를 커밋을 기다리는 플랫 파일에 쓰는 경우조차도) 것은 분명합니다. 좋은 생각이 아닙니다.

청크를위한 일괄 처리를 수행하거나 최소한이 특수한 경우에는 FlushModeType이 AUTO로 설정된 레코드 자동 커밋에서 시작해야합니다.

관련 문제