2012-12-06 5 views
0

smooks를 사용하여 .csv 파일에서 레코드를 가져 왔습니다.이 파일에서 약 3MB의 레코드 레코드가 목록으로 가져옵니다.엔티티 관리자를 사용하여 DB로 각 트랜잭션을 플러시하는 방법

다음으로 완료되었습니다. 목록은 subList를 사용하여 하위 파트로 나뉩니다. 파티션 크기는 2000 개까지입니다.

나는 하나의 트랜잭션에서 2000 레코드를 플러시하고 싶다. 그러나 내 코드에서는 그렇게 할 수 없다.

나는 seam 2.1.2, jap with hibernate, EntityManager, JTA Transactions를 사용하고있다.

components.xml 

    <core:init debug="false" jndi-pattern="@[email protected]" /> 
    <core:manager concurrent-request-timeout="2000" 
     conversation-id-parameter="cid" conversation-timeout="120000" 
     parent-conversation-id-parameter="pid" /> 
    <web:hot-deploy-filter url-pattern="/*.mobee" /> 
    <persistence:entity-manager-factory 
     installed="@[email protected]" name="entityManagerFactory" 
     persistence-unit-name="mobeeadmin" /> 
    <persistence:managed-persistence-context 
     auto-create="true" entity-manager-factory="@[email protected]" name="entityManager" 
     persistence-unit-jndi-name="@[email protected]" /> 
<async:quartz-dispatcher /> 
    <security:identity authenticate-method="#{authenticator.authenticate}" /> 
    <web:rewrite-filter view-mapping="*.mobee" /> 
    <web:multipart-filter create-temp-files="true" max-request-size="28672000"  url-pattern="*.seam"/> 
    <event type="org.jboss.seam.security.notLoggedIn"> 
     <action execute="#{redirect.captureCurrentView}" /> 
    </event> 
<event type="org.jboss.seam.security.loginSuccessful"> 
     <action execute="#{redirect.returnToCapturedView}" /> 
    </event> 
    <mail:mail-session host="localhost" port="25" /> 

자바 코드 :

private List<DoTempCustomers> doTempCustomers; 

    int partitionSize = 2000; 

    for (int i = 0; i < doTempCustomers.size(); i += partitionSize) { 
     String message= tempCustomerMigration(doTempCustomers.subList(i, 
       i + Math.min(partitionSize, doTempCustomers.size() - i))); 
    } 



@Begin(join=true) 
    public String tempCustomerMigration(List<DoTempCustomers> list){ 
     PersistenceProvider.instance().setFlushModeManual(getEntityManager()); 
     TempCustomers temp = null; 
     for(DoTempCustomers tempCustomers:list){ 
     try { 
     temp=new TempCustomers(); 
      BeanUtils.copyProperties(temp, tempCustomers); 
      getEntityManager.persist(); 
      getEntityManager.flush(); 
     } 

나는이 문제가

그렇지 않으면 일부를 GUI에하기 전에 서버 응답을 보내 각 트랜잭션에 DB 레코드를 플러시하는 방법에 대한 졸을 가진 적이 없어 너무 여러 번 시도했다 처리 시간은 예외가 있습니다.

2012-12-06 17:09:56,380 WARN [com.arjuna.ats.arjuna.logging.arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.BasicAction_58] - Abort of action id -53eff40e:f2db:50c0a356:7d invoked while multiple threads active within it. 
2012-12-06 17:09:56,380 WARN [com.arjuna.ats.arjuna.logging.arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.CheckedAction_2] - CheckedAction::check - atomic action -53eff40e:f2db:50c0a356:7d aborting with 1 threads active! 
2012-12-06 17:09:56,522 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.parentTraceEnabled=true 
2012-12-06 17:09:56,522 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.nestedTraceEnabled=false 
2012-12-06 17:09:56,522 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.detectDuplicateNesting=true 
2012-12-06 17:09:56,524 INFO [STDOUT] [Mobee]- WARN 2012-12-06 17:09:56,524 [] JDBCExceptionReporter - SQL Error: 0, SQLState: null 
2012-12-06 17:09:56,525 INFO [STDOUT] [Mobee]-ERROR 2012-12-06 17:09:56,524 [] JDBCExceptionReporter - Transaction is not active: tx=TransactionImple < ac, BasicAction: -53eff40e:f2db:50c0a356:7d status: ActionStatus.ABORTING >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -53eff40e:f2db:50c0a356:7d status: ActionStatus.ABORTING >) 
2012-12-06 17:09:56,545 INFO [STDOUT] [Mobee]-ERROR 2012-12-06 17:09:56,527 [] AbstractFlushingEventListener - Could not synchronize database state with session 
org.hibernate.exception.GenericJDBCException: Cannot open connection 
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103) 

나는 goog에서 sol을 발견했습니다. 나를 위해 jboss - service.xml에서 TransactionTimeout을 증가 시키려면 timeout 매개 변수를 늘리는 것조차 사용하지 마십시오.

답변

0

EJB 세션 Bean 인 새 Seam 구성 요소를 만들고 UserTransaction을 사용하여 일괄 적으로 업데이트/삽입을 수행 할 수 있습니다. 또한 UserTransaction을 사용하면 트랜잭션 시간 초과를 지정할 수 있습니다. 당신은 당신이 위에서 사용하고있는 컴포넌트에이 새로운 컴포넌트를 주입 할 것입니다. Here is an example - see the 5th post.. 그렇지 않으면, EJB를 사용하고 싶지 않다면, 당신은 하나의 대화에 범위가 지정된 Seam managed persistence context을 사용하고 있기 때문에 중첩 된 Seam 대화를 사용해야한다고 생각합니다.