2013-06-11 8 views
3


업데이트하는 동안 커밋 : 나는 Bitronix TM으로 테스트했다을하고 문제가 보스 TM (아르주나) 또는 내 구성에서, 그래서 그것은 완벽하게 롤백.
JtaTransactionManager를 더 롤백 후 "플러시"

업데이트 2 :는 트랜잭션이 글로벌없는 것처럼, 내가 Bitronix 데이터 소스가 allowLocalTransactions 속성이 서로 다른 데이터 소스를 시도하고 그것을 설정 한 후 내 응용 프로그램이 어떤 지역에서 사용하려한다는 예외를 throw 보인다 방법. 이 데이터 소스로 Bitronix를 사용하면 오류없이 작동합니다. 나는 configs에 잘못된 것이 있다고 생각한다.

JTA 트랜잭션에 문제가 있습니다. Tomcat 7 + Hibernate 4 + Spring 3 + JBoss TS 4 및 JTA 트랜잭션을 사용하고 있습니다.

@Transactional(propagation = Propagation.REQUIRED) 
public void testMethod() { 
    insertOfSomeNewEntityInstance(); 
    updateOfAnotherEntity(); 
} 

private void insertOfSomeNewEntityInstance() { 
    SomeEntity entity = new SomeEntity(); 
    someEntityDAO.save(entity); 
} 

private void updateOfAnotherEntity() { 
    AnotherEntity anotherEntity = anotherEntityDAO.findBySomeProperty(1L); 
    anotherEntity.incrementSomeValue(); 
    anotherEntityDAO.save(anotherEntity); 
} 

이 방법은 가 발생하는 경우 :

는 다음과 같은 방법이있다 가정하자 "org.hibernate.StaleObjectStateException을 : 행이 업데이트 또는 삭제 다른 트랜잭션 (또는 저장되지 않은 값의 매핑이 잘못했다)했다"동안을 "refreshOfAnotherEntity()"메소드 실행 또는 "flush"중에 발생할 수있는 다른 런타임 예외 (Hibernate는 또한 다음을 나타냄 : ) HHH000346 : 관리되는 플러시 중 오류 [행이 다른 트랜잭션에 의해 업데이트 또는 삭제되거나 저장되지 않은 값 매핑이 올바르지 않음] . 그런 다음 insertOfSomeNewEntityInstanc의 결과 e() 실행은 롤백되지 않습니다.

이 문제를 디버깅 한 후 I가 org.springframework.transaction.jta.JtaTransaction 관리자 "doCommit"방법을 발견

@Override 
    protected void doCommit(DefaultTransactionStatus status) { 
     JtaTransactionObject txObject = (JtaTransactionObject) status.getTransaction(); 
     try { 
      int jtaStatus = txObject.getUserTransaction().getStatus(); 
      if (jtaStatus == Status.STATUS_NO_TRANSACTION) { 
       throw new UnexpectedRollbackException("JTA transaction already completed - probably rolled back"); 
      } 
      if (jtaStatus == Status.STATUS_ROLLEDBACK) { 
       try { 
        txObject.getUserTransaction().rollback(); 
       } 
       catch (IllegalStateException ex) { 
        if (logger.isDebugEnabled()) { 
         logger.debug("Rollback failure with transaction already marked as rolled back: " + ex); 
        } 
       } 
       throw new UnexpectedRollbackException("JTA transaction already rolled back (probably due to a timeout)"); 
      } 
      txObject.getUserTransaction().commit(); 
     } 
     catch (RollbackException ex) { 
      throw new UnexpectedRollbackException(
        "JTA transaction unexpectedly rolled back (maybe due to a timeout)", ex); 
     } 
     catch (HeuristicMixedException ex) { 
      throw new HeuristicCompletionException(HeuristicCompletionException.STATE_MIXED, ex); 
     } 
     catch (HeuristicRollbackException ex) { 
      throw new HeuristicCompletionException(HeuristicCompletionException.STATE_ROLLED_BACK, ex); 
     } 
     catch (IllegalStateException ex) { 
      throw new TransactionSystemException("Unexpected internal transaction state", ex); 
     } 
     catch (SystemException ex) { 
      throw new TransactionSystemException("JTA failure on commit", ex); 
     } 
    } 

경우 "txObject.getUserTransaction()) (커밋."

} 
catch (UnexpectedRollbackException ex) { 
       // can only be caused by doCommit 
       triggerAfterCompletion(status, TransactionSynchronization.STATUS_ROLLED_BACK); 
       throw ex; 
    } 

내가 triggerAfterCompletion의 모든 롤백이 표시되지 않습니다 (: RollbackException 다음이 방법은 UnexpectedRollbackException을 던져 여기를 잡는다 org.springframework.transaction.support.AbstractPl atformTransactionManager processCommit (...)의 부분 실패) 메소드를 호출하고이 메소드 다음에 다른 모든 메소드는 자원을 정리한다.

는 봄/제이 보스 단지, insertOfSomeNewEntityInstance()의 결과를 저지른 때문에 동시 수정 오류() updateOfAnotherEntity을 실행하는 데 실패하고 아무것도 롤백하지 않습니다 요약합니다. updateOfAnotherEntity()에서 런타임이나 예외를 수동으로 throw하면 올바르게 롤백되지만, Hibernate가 "flush"중에 런타임 예외를 throw하는 경우에만 문제가 발생합니다.

hibernate.cfg

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD//EN" 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
<session-factory> 
    <property name="dialect">${dialect}</property> 
    <property name="max_fetch_depth">1</property> 
    <property name="hibernate.jdbc.batch_size">25</property> 
    <property name="show_sql">false</property> 
    <property name="format_sql">false</property> 
    <property name="use_sql_comments">false</property> 
    <property name="hibernate.session_factory_name">TestSessionFactory</property> 
    <property name="hibernate.session_factory_name_is_jndi">false</property> 
    <property name="hibernate.current_session_context_class">jta</property> 
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property> 
    <property name="hibernate.transaction.jta.platform">org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform</property> 
    <property name="hibernate.id.new_generator_mappings">true</property> 
    <property name="hibernate.cache.infinispan.cfg">infinispan.xml</property> 
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.infinispan.InfinispanRegionFactory</property> 
</session-factory> 
</hibernate-configuration> 

jbossts-properties.xml의 ApplicationContext의

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> 
    <entry key="CoordinatorEnvironmentBean.commitOnePhase">YES</entry> 
    <entry key="CoordinatorEnvironmentBean.defaultTimeout">300</entry> 
    <entry key="ObjectStoreEnvironmentBean.transactionSync">ON</entry> 
    <entry key="CoreEnvironmentBean.nodeIdentifier">1</entry> 
    <entry key="JTAEnvironmentBean.xaRecoveryNodes">1</entry> 
    <entry key="JTAEnvironmentBean.xaResourceOrphanFilterClassNames"> 
     com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter 
     com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter 
    </entry> 

    <entry key="CoreEnvironmentBean.socketProcessIdPort">0</entry> 

    <entry key="RecoveryEnvironmentBean.recoveryModuleClassNames"> 
     com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule 
     com.arjuna.ats.internal.txoj.recovery.TORecoveryModule 
     com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule 
    </entry> 

    <entry key="RecoveryEnvironmentBean.expiryScannerClassNames"> 
     com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner 
    </entry> 

    <entry key="RecoveryEnvironmentBean.recoveryPort">4712</entry> 

    <entry key="RecoveryEnvironmentBean.recoveryAddress"></entry> 

    <entry key="RecoveryEnvironmentBean.transactionStatusManagerPort">0</entry> 
    <entry key="RecoveryEnvironmentBean.transactionStatusManagerAddress"></entry> 

    <entry key="RecoveryEnvironmentBean.recoveryListener">YES</entry> 

</properties> 

부.XML

<bean class="com.arjuna.ats.jta.TransactionManager" factory-method="transactionManager" id="arjunaTransactionManager"></bean> 
    <bean class="com.arjuna.ats.jta.UserTransaction" factory-method="userTransaction" id="arjunaUserTransaction"></bean> 

    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" > 
     <property name="transactionManager" ref="arjunaTransactionManager"/> 
     <property name="userTransaction" ref="arjunaUserTransaction"/> 
    </bean> 

    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.XADataSource" destroy-method="close"> 
     <property name="url" value="${database.url}" /> 
     <property name="driverClassName" value="oracle.jdbc.OracleDriver" /> 
     <property name="username" value="${database.user}" /> 
     <property name="password" value="${database.password}" /> 
    </bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" destroy-method="destroy"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="configLocation"><value>classpath:hibernate.cfg.xml</value></property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.cache.use_second_level_cache">false</prop> 
       <prop key="hibernate.cache.use_query_cache">false</prop> 
      </props> 
     </property> 
    </bean> 

    <tx:annotation-driven mode="proxy" proxy-target-class="false" transaction-manager="transactionManager"/> 

그리고 로그 :

Completing transaction for [...testMethod] 
Triggering beforeCommit synchronization 
Triggering beforeCompletion synchronization 
BaseTransaction.getStatus 
TransactionImple.getStatus 
Initiating transaction commit 
BaseTransaction.getStatus 
TransactionImple.getStatus 
BaseTransaction.commit 
TransactionImple.commitAndDisassociate 
SynchronizationImple.beforeCompletion 
BaseTransaction.getStatus 
TransactionImple.getStatus 

insert into ..... 
update ... set ... 

BaseTransaction.setRollbackOnly 
TransactionImple.setRollbackOnly 
BasicAction::preventCommit(BasicAction: 0:ffffc0a800ab:8d15:51b6fe47:3 status: ActionStatus.RUNNING) 
HHH000346: Error during managed flush [Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [...]] 
ARJUNA012125: TwoPhaseCoordinator.beforeCompletion - failed for SynchronizationImple< 0:ffffc0a800ab:8d15:51b6fe47:4, org.hibernate.engine[email protected]76d7a0b8 > 
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [...] 
     at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:2509) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3228) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3126) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3456) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:287) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:113) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:53) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:273) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:93) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1165) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126) [narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1010) [spring-tx-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) [spring-tx-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) [spring-tx-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:387) [spring-tx-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) [spring-tx-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) [spring-aop-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) [spring-aop-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at $Proxy126.testMethod(Unknown Source) [na:na] 
     ... 

BasicAction::preventCommit(BasicAction: 0:ffffc0a800ab:8d15:51b6fe47:3 status: ActionStatus.ABORT_ONLY) 
BasicAction::Abort() for action-id 0:ffffc0a800ab:8d15:51b6fe47:3 
SynchronizationImple.afterCompletion 
TransactionImple.equals 
SynchronizationImple.afterCompletion 
BasicAction::removeChildThread() action 0:ffffc0a800ab:8d15:51b6fe47:3 removing TSThread:2 
BasicAction::removeChildThread() action 0:ffffc0a800ab:8d15:51b6fe47:3 removing TSThread:2 result = true 
TransactionReaper::remove (BasicAction: 0:ffffc0a800ab:8d15:51b6fe47:3 status: ActionStatus.ABORTED) 
Triggering afterCompletion synchronization 
Clearing transaction synchronization 
Exception 
org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction. 
     at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1013) ~[spring-tx-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) ~[spring-tx-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) ~[spring-tx-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:387) ~[spring-tx-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) ~[spring-tx-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) ~[spring-aop-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     at $Proxy126.testMethod(Unknown Source) ~[na:na] 
     ... 
Caused by: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction. 
     at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1177) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1010) ~[spring-tx-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
     ... 32 common frames omitted 
Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [...] 
     at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:2509) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3228) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3126) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3456) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:287) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:113) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:53) ~[hibernate-core-4.2.2.Final.jar:4.2.2.Final] 
     at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:273) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:93) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1165) ~[narayana-jta-4.17.4.Final.jar:4.17.4.Final] 
     ... 34 common frames omitted 

답변

1

나는 문제가 구성에 있었던 것으로 나타났습니다. Tomcat XA 풀은 JBoss Transaction Manager에 대해 알지 못했습니다. 나는이 같은 TransactionalDriver하는 driverClassName을 변경하려고 :

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.XADataSource" destroy-method="close"> 
     <property name="defaultAutoCommit" value="false" /> 
     <property name="url" value="jdbc:arjuna:" /> 
     <property name="driverClassName"> 
      <value>com.arjuna.ats.jdbc.TransactionalDriver</value> 
     </property> 
     <property name="username" value="${database.user}" /> 
     <property name="password" value="${database.password}" /> 
     <property name="initialSize" value="${database.pool.initialSize}"/> 
     <property name="maxActive" value="${database.pool.maxSize}"/> 
     <property name="maxIdle" value="${database.pool.maxSize}"/> 
     <property name="connectionProperties" value="DYNAMIC_CLASS=com.example.CustomDatasourceLoader;"/> 

불행하게도 그것은 내가 다른 연결 풀을 찾아야했다 있도록 연결이 다른 트랜잭션에 속한다는 것을 말하는 서브 트랜잭션에 대한 예외를 던지고.

Oracle UCP 풀도 올바르게 작동하지 않으므로 driverClassName을 OracleDriver에 하드 코딩되어 있기 때문에 TransactionClassName을 TransactionalDriver로 변경할 방법이 없습니다.

다음 구성

나 (DBCP XA 풀) 작동하고 올바르게 롤백, 커밋, 서브 트랜잭션을 지원합니다

<bean id="oracleXADataSource" class="oracle.jdbc.xa.client.OracleXADataSource"> 
     <property name="user" value="${database.user}"/> 
     <property name="password" value="${database.password}"/> 
     <property name="URL" value="${database.url}"/> 
    </bean> 

    <bean id="dsXAConnectionFactory" class="org.apache.commons.dbcp.managed.DataSourceXAConnectionFactory"> 
     <constructor-arg><ref bean="arjunaTransactionManager"></ref></constructor-arg> 
     <constructor-arg><ref bean="oracleXADataSource"></ref></constructor-arg> 
    </bean> 

    <bean id="pool" class="org.apache.commons.pool.impl.GenericObjectPool"> 
     <property name="maxActive" value="${database.pool.maxSize}"/> 
     <property name="minIdle" value="${database.pool.initialSize}"/> 
    </bean> 

    <bean id="poolableConnectionFactory" class="org.apache.commons.dbcp.PoolableConnectionFactory"> 
     <constructor-arg name="connFactory" ref="dsXAConnectionFactory"/> 
     <constructor-arg name="pool" ref="pool"/> 
     <constructor-arg name="stmtPoolFactory"><null></null></constructor-arg> 
     <constructor-arg name="validationQuery"><null></null></constructor-arg> 
     <constructor-arg name="defaultReadOnly" value="false"/> 
     <constructor-arg name="defaultAutoCommit" value="false"/> 
    </bean> 


    <bean id="dataSource" class="org.apache.commons.dbcp.managed.ManagedDataSource" depends-on="poolableConnectionFactory"> 
     <constructor-arg name="pool" ref="pool"/> 
     <constructor-arg name="transactionRegistry" value="#{dsXAConnectionFactory.getTransactionRegistry()}"/> 
    </bean> 

내가 DBCP 풀을 사용하는 방법에 대한 몇 가지 우려를 가지고 있지만 지금은 유일한 작업 솔루션입니다.

관련 문제