2015-01-01 2 views
1

В настоящее время я работаю над Java-приложением, используя Spring, Hibernate и т. Д. Под Tomcat. Я пытался настроить JTA с помощью Atomikos, но это выглядит, как у меня есть проблема, когда вровень делается :(Atomicos с MySQL JTA не работает должным образом

Там много конфигурации, поэтому я надену основные части:

<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> 

<property name="xaDataSourceClassName"> 
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value> 
</property> 
</bean> 

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" /> 
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.J2eeUserTransaction" /> 

<bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" depends-on="userTransactionService,atomikosTransactionManager,atomikosUserTransaction"> 
     <property name="transactionManager" ref="atomikosTransactionManager" /> 
     <property name="userTransaction" ref="atomikosUserTransaction" /> 
     <property name="allowCustomIsolationLevels" value="true"></property> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jtaTransactionManager" ref="jtaTransactionManager"></property> 
    <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.format_sql">true</prop> 
       <prop key="hibernate.use_sql_comments">false</prop> 
       <prop key="hibernate.current_session_context_class">jta</prop>    
      </props> 
     </property> 
</bean> 

При запуске сделка с использованием @Transactional, я в состоянии выполнять запросы, но при сохранении через Hibernate getCurrentSession() Я получаю следующее исключение: (если коммит это сделано)

org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException: The transaction was set to rollback only 
    at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1024) 
.. 

Caused by: com.atomikos.datasource.ResourceException: XA resource 'XADBMS': resume for XID '31302E38382E36382E32342E746D30303030313030303137:31302E38382E36382E32342E746D31' raised -5: invalid arguments 

.. 

[11:36:30:534 (http-bio-8080-exec-3) org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorNonTrackingImpl$2.mapManagedFlushFailure(SynchronizationCallbackCoordinatorNonTrackingImpl.java:179)] 
ERROR: HHH000346: Error during managed flush [XA resource 'XADBMS': resume for XID '31302E38382E36382E32342E746D30303030313030303139:31302E38382E36382E32342E746D31' raised -5: invalid arguments were given for the XA operation] 

ответ

2

Я думаю, что я нашел проблему ! Это связано с Atomicos b ug, который связан с MySQL.

После добавления параметра pinGlobalTxToPhysicalConnection = true в URL-адрес соединения или в качестве параметра внутри определения com.atomikos.jdbc.AtomikosDataSourceBean Spring, он решил мою проблему.

<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" 
     init-method="init" destroy-method="close"> 
... 
<property name="xaProperties"> 
    <props> 
     <prop key="pinGlobalTxToPhysicalConnection">true</prop> 
    </props>  
</property> 
</bean> 
Смежные вопросы