Мы используем atomikos JTA с пружиной и двумя различными источниками данных mysql.Данные о пружинах - два разных источника данных в одной и той же транзакции, вызывающей аномалию
Мы получили проблему,
Когда мы используем два разных репозиториев (из 2-х различных источников данных) на том же @Transactional метода мы получаем ошибку:
Caused by: java.sql.SQLException: Unable to enlist connection the transaction
Это происходит, когда второе хранилище делая некоторые действия против источника данных.
Мы считаем, что это связано с менеджером транзакций (atomikos jta), который может иметь проблемы, когда в одну транзакцию вовлечены 2 разных источника данных.
вот источники данных XML:
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="xaDataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
lazy-init="true">
<property name="pinGlobalTxToPhysicalConnection" value="true" />
<property name="url" value="${mysql_url}" />
<property name="user" value="root" />
<property name="password" value="xxx" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.managed.BasicManagedDataSource">
<property name="initialSize" value="10" />
<property name="maxActive" value="100" />
<property name="maxIdle" value="15" />
<property name="minIdle" value="10" />
<property name="timeBetweenEvictionRunsMillis" value="10000" />
<property name="minEvictableIdleTimeMillis" value="60000" />
<property name="validationQuery" value="/* ping */ SELECT 1" />
<property name="testOnBorrow" value="true" />
<property name="testWhileIdle" value="true" />
<property name="xaDataSourceInstance" ref="xaDataSource" />
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="removeAbandoned" value="true" />
<property name="removeAbandonedTimeout" value="300" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="packagesToScan" value="com.xxx.model" />
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
</props>
</property>
<property name="dataSource" ref="dataSource" />
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL" />
<property name="showSql" value="false" />
<property name="generateDdl" value="false" />
</bean>
</property>
<property name="jpaPropertyMap">
<map>
<entry key="javax.persistence.transactionType" value="JTA" />
<entry key="hibernate.transaction.manager_lookup_class"
value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
<entry key="hibernate.connection.autocommit" value="false" />
</map>
</property>
</bean>
<!-- shared data source -->
<bean id="shardXaDataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
lazy-init="true">
<property name="pinGlobalTxToPhysicalConnection" value="true" />
<property name="url" value="${shared_mysql_url}" />
<property name="user" value="root" />
<property name="password" value="xxx" />
</bean>
<bean id="shareddDataSource" class="org.apache.commons.dbcp.managed.BasicManagedDataSource">
<property name="initialSize" value="10" />
<property name="maxActive" value="100" />
<property name="maxIdle" value="15" />
<property name="minIdle" value="10" />
<property name="timeBetweenEvictionRunsMillis" value="10000" />
<property name="minEvictableIdleTimeMillis" value="60000" />
<property name="validationQuery" value="/* ping */ SELECT 1" />
<property name="testOnBorrow" value="true" />
<property name="testWhileIdle" value="true" />
<property name="xaDataSourceInstance" ref="shardXaDataSource" />
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="removeAbandoned" value="true" />
<property name="removeAbandonedTimeout" value="300" />
</bean>
<bean id="sharedEntityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="packagesToScan" value="com.xxx.shared.model" />
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
</props>
</property>
<property name="dataSource" ref="shareddDataSource" />
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL" />
<property name="showSql" value="false" />
<property name="generateDdl" value="false" />
</bean>
</property>
<property name="jpaPropertyMap">
<map>
<entry key="javax.persistence.transactionType" value="JTA" />
<entry key="hibernate.transaction.manager_lookup_class"
value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
<entry key="hibernate.connection.autocommit" value="false" />
</map>
</property>
</bean>
и transaction.xml:
<tx:annotation-driven proxy-target-class="true" />
<tx:jta-transaction-manager
transaction-manager="atomikosTransactionManager" />
<tx:annotation-driven transaction-manager="atomikosTransactionManager"
proxy-target-class="true" />
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown" value="false" />
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
<property name="allowCustomIsolationLevels" value="true" />
</bean>
* EDIT (19.01.2014) *
Так, по М. Deinum нам удалось убрать ошибку, но теперь не происходит транзакции актуария (при исключении, например, нет отката)
Вот наша новая конфигурация:
данных source.xml:
<bean id="xaDataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
lazy-init="true">
<property name="pinGlobalTxToPhysicalConnection" value="true" />
<property name="url" value="${mysql_url}" />
<property name="user" value="root" />
<property name="password" value="6918001" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jtaDataSource" ref="xaDataSource" />
<property name="packagesToScan" value="com.xxx.model" />
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup </prop>
</props>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="showSql" value="false" />
<property name="generateDdl" value="false" />
</bean>
</property>
</bean>
<bean id="shardXaDataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
lazy-init="true">
<property name="pinGlobalTxToPhysicalConnection" value="true" />
<property name="url" value="${shared_mysql_url}" />
<property name="user" value="root" />
<property name="password" value="6918001" />
</bean>
<bean id="sharedEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jtaDataSource" ref="shardXaDataSource" />
<property name="packagesToScan" value="com.xxx.shared.model" />
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop>
</props>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="showSql" value="false" />
<property name="generateDdl" value="false" />
</bean>
</property>
transaction.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<tx:annotation-driven proxy-target-class="true" />
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown" value="false" />
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
<property name="allowCustomIsolationLevels" value="true" />
</bean>
</beans>
* EDIT 01/20/2014 *
Нам удалось заставить его работать, но тонны предупреждений при запуске:
20 Jan 2014 15:14:16 WARN AbstractDataSourceBean - AtomikosDataSoureBean 'xaDataSource': poolSize equals default - this may cause performance problems!
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:17 WARN JtaPlatformInitiator - HHH000427: Using deprecated org.hibernate.transaction.TransactionManagerLookup strategy [hibernate.transaction.manager_lookup_class], use newer org.hibernate.service.jta.platform.spi.JtaPlatform strategy instead [hibernate.transaction.jta.platform]
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AbstractDataSourceBean - AtomikosDataSoureBean 'sharedXaDataSource': poolSize equals default - this may cause performance problems!
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN JtaPlatformInitiator - HHH000427: Using deprecated org.hibernate.transaction.TransactionManagerLookup strategy [hibernate.transaction.manager_lookup_class], use newer org.hibernate.service.jta.platform.spi.JtaPlatform strategy instead [hibernate.transaction.jta.platform]
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN EntityManagerFactoryRegistry - HHH000436: Entity manager factory name (default) is already registered. If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name'
20 Jan 2014 15:14:18 WARN UserTransactionServiceImp - No properties path set - looking for transactions.properties in classpath...
20 Jan 2014 15:14:18 WARN UserTransactionServiceImp - transactions.properties not found - looking for jta.properties in classpath...
20 Jan 2014 15:14:18 WARN UserTransactionServiceImp - Failed to open transactions properties file - using default values
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050100104 with state COMMITTING
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050100104 with state COMMITTING
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050200104 with state COMMITTING
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050200104 with state COMMITTING
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050300104 with state COMMITTING
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050300104 with state COMMITTING
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050400104 with state COMMITTING
Новая конфигурация:
<bean id="xaDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close">
<property name="xaDataSourceClassName">
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
</property>
<property name="uniqueResourceName"><value>xaDataSource</value></property>
<property name="xaProperties">
<props>
<prop key="url">${mysql_url}</prop>
<prop key="user">root</prop>
<prop key="password">xxx</prop>
</props>
</property>
</bean>
<bean id="sharedXaDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close">
<property name="xaDataSourceClassName">
<value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>
</property>
<property name="uniqueResourceName"><value>sharedXaDataSource</value></property>
<property name="xaProperties">
<props>
<prop key="url">${shared_mysql_url}</prop>
<prop key="user">root</prop>
<prop key="password">xxx</prop>
</props>
</property>
</bean>
M.Deinum, Ошибка теперь не бросается, и это отличная новость !. однако теперь откат не выдается для всех моих entites (из любого источника данных). например, если моя служба аннотируется с @Transactional и я сохраняю сущность внутри нее, если ошибка возникает после того, как нет отката :(, Iv'e отредактировал мой оригинальный пост с изменениями, которые я сделал. Спасибо! – Urbanleg
Есть ли нет отката в регистрации или отсутствии отката в базе данных? Вы используете MySQL, поэтому также убедитесь, что используете типы транзакционных таблиц (InnoDB, а не MyISAM). Возможно, вы захотите включить ведение журнала DEBUG для 'org.springframework' и посмотреть, что произойдет (если tx правильно запущен и т. д.) –
Спасибо Deinum, мы сделали то, что вы предложили, у нас есть ошибка в наших журналах. Мы помещаем его в исходное сообщение (*** edit2 ***) – Urbanleg