2013-04-14 3 views
4

현재 우리는 Java와 MySQL에서 1.2.5 버전을 사용하고 있습니다. 우리는 데이터베이스에 저장하는 간단한 JPA 모델 (Model 클래스를 확장하는 Play 엔터티)을 가지고 있습니다. 각 웹 요청에 다중 삽입을 처리하는 가장 좋은 방법

SimpleModel() test = new SimpleModel(); 
test.foo = "bar"; 
test.save(); 

우리는 예를 들어, SimpleModel의 여러 인스턴스를 저장 : 우리는 수동으로 시작하고 트랜잭션을 종료 JPAPlugin.startTx 및 closeTx를 사용하는

JPAPlugin.startTx(false); 
for (int i=0;i<5000;i++) 
{ 
    SimpleModel() test = new SimpleModel(); 
    test.foo = "bar"; 
    test.save(); 
} 
JPAPlugin.closeTx(false); 

. 트랜잭션을 실행하는 요청이 하나뿐이면 모든 것이 올바르게 작동합니다. 두 번째 요청이 루프를 동시에 실행하려고하면 두 번째 요청에 "대기 대기 시간 초과가 발생했습니다. 트랜잭션을 다시 시작하십시오. javax.persistence.PersistenceException : org.hibernate.exception.GenericJDBCException : 삽입 할 수 없습니다 : [ SimpleModel] "첫 번째 요청이 테이블을 잠그지 만 두 번째 요청이 시간 초과 될 때까지 완료되지 않기 때문입니다. 널 (null) : - :

오류 AssertionFailure : 어설 션 오류 (이 최대 절전 모드의 버그를 나타낼 수 있지만 인해 세션의 안전하지 않은 사용 가능성이) 발생 org.hibernate.AssertionFailure 45 이 여러 결과 SimpleModel 항목의 id (예외 발생 후 Session을 비우지 않음)

또 다른 감염은 삽입하는 동안 CPU 사용량이 미쳐 버린다는 것입니다.

이 문제를 해결하려면 엔티티를 순차적으로 삽입하는 트랜잭션 인식 대기열을 만들려고하는데 이것은 삽입 시간이 길어질 것입니다. 이 상황을 처리하는 올바른 방법은 무엇입니까?

답변

0

JPAPlugin on Play Framwork 1.2.5는 스레드로부터 안전하지 않으므로이 버전의 Play를 사용하여 해결되지 않습니다.

이 문제는 Play 2.x에서 수정되었지만 마이그레이션 할 수없는 경우 직접 최대 절전 모드를 사용해보십시오.

+0

2 배로 시도해보고 어떤 결과가 나타나는지 살펴 보겠습니다. – kospol

0

이 시나리오에서는 트랜잭션을 직접 처리 할 필요가 없습니다.

대신 작업에 시간이 많이 걸리는 경우 컨트롤러 메서드 또는 비동기 작업에 삽입하십시오.

작업 및 컨트롤러 모두 경매를 처리합니다.

그러나 이것이 실제로 달성하려는 내용인지 확인하십시오. 5000 개의 레코드를 생성하는 각 HTTP 요청은 현실적으로 보이지 않습니다. 아마도 컬렉션이있는 컨테이너 모델을 갖는 것이 더 합리적일까요?

+0

각 요청이 재생 작업을 시작하지만 문제가 남아 있습니다. – kospol

+0

트랜잭션이 JobPlugin에 의해 처리되므로 startTx와 stopTx를 제거하십시오.job.now() 양식을 사용하여 비동기 적으로 작업을 실행하고 있습니까? – emt14

0

전체 삽입물에 대한 트랜잭션이 정말로 필요합니까? 데이터 가져 오기 중에 데이터베이스가 잠겨 있지 않은지 여부가 중요합니까?

당신은 단순히 일자리를 만들고 각 삽입을 위해 그것을 실행할 수 있습니다

for (int i=0;i<5000;i++) 
{ 
    new Job() { 
     doJob(){ 
      SimpleModel() test = new SimpleModel(); 
      test.foo = "bar"; 
      test.save(); 
     }.now(); 
} 

이것은 각 삽입에 대한 하나의 트랜잭션을 생성하고 데이터베이스 잠금 문제를 제거.

+0

나는 이것이 상황을 더욱 악화시킬 것이라고 믿습니다 ... – kospol

관련 문제