Spring data - zwei unterschiedliche Daten-Quellen auf der gleichen Transaktion verursacht Anomalie
Sind wir mit atomikos JTA mit spring und 2 verschiedenen mysql-Datenquellen.
Wir haben ein problem,
Wenn wir zwei verschiedene repositories (von 2 verschiedenen Datenquellen), die auf der gleichen @Transactional-Methode erhalten wir einen Fehler:
Caused by: java.sql.SQLException: Unable to enlist connection the transaction
Dies geschieht, wenn das zweite repository macht einige Schritte gegen die Quelle der Daten.
Wir glauben, es hat etwas zu tun mit der Transaktions-manager (atomikos jta) , haben möglicherweise Probleme, wenn 2 unterschiedliche Datenquellen beteiligt sind, in der gleichen Transaktion.
ist hier die Datenquellen, die 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>
und die 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) *
Also nach M. Deinum Hilfe haben wir es geschafft, die Fehler gehen Weg, aber nun gibt es keine aktuellen Transaktion stattfindet (Ausnahme zum Beispiel gibt es kein roll-back)
Hier ist unsere neue Konfiguration:
data-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 *
Schafften wir es, damit es funktioniert, aber Tonnen von Warnungen beim Start:
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 com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: WARNING: transaction manager not running?
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: WARNING: transaction manager not running?
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: WARNING: transaction manager not running?
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: WARNING: transaction manager not running?
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: 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 com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4063a38e: 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 com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: 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 com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: WARNING: transaction manager not running?
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@3d00772f: 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
Wird die neue Konfiguration :
<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>
InformationsquelleAutor Urbanleg | 2014-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deine Konfiguration ist fehlerhaft und enthält Duplikation, die Sie wahrscheinlich verwirrt Frühjahr. Sowohl die
JtaTransactionManager
sowie<tx:jta-transaction-manager />
erstellen Sie eineJtaTransactionManager
.Neben Ihrem
<tx:annotation-driven >
zeigen sollte, zu einerJtaTransactionManager
aber nog weist Sie auf eineUserTransactionManager
.Also erstmal fix die Konfiguration:
Vorausgesetzt, Sie verwenden eine aktuelle Spring version 3.2 statt, die Injektion der
dataSource
Eigenschaft injizieren diejtaDataSource
auf IhreLocalContainerEntityManagerFactoryBean
neben IhrjpaProperties
undjpaPropertiesMap
bereinigt werden können.Den
hibernate.connection
Eigenschaften sind nutzlos, da Sie Injektion eines Spring verwaltete Datenquelle. Durch die Injektion desjtaDataSource
die jpaProperty fürjavax.persistence.transactionType
entfernt werden kann. DieHibernateJpaVendorAdapter
schon legt dieHibernateJpaDialect
und Sie können diedatabasePlatform
- Eigenschaft geben Sie den Dialekt.Bezüglich Ihrer datasources Sie sollten mit den Atomikos-Wrapper für die Datenquellen, so dass Sie sich bewusst sind, Atomikos. Verwenden Sie dafür die
AtomikosDataSourceBean
statt des xa-datasource zur Verfügung gestellt für Ihren JDBC-Treiber.Schließlich sind Sie mit den
BasicDataSource
als Referenz für die Winterruhe in der Erwägung, dass Sie sollte benutzen Sie die xa aktiviert (und gewickelt) - Datenquelle.Gibt es kein rollback in der Protokollierung oder kein rollback in der Datenbank? Sie werden mit Hilfe von MySQL, damit auch sicher, dass Sie verwenden Transaktions-Arten von Tabellen (InnoDB und nicht MyISAM). Sie vielleicht wollen, aktivieren Sie die DEBUG-Protokollierung für
org.springframework
und sehen, was passiert (wenn ein tx ist korrekt gestartet, etc.).Dank Deinum, Wir haben wie Sie vorgeschlagen, wir haben einen Fehler in unseren logs. wir setzen es auf der original-post (*** edit2 ***)
Das ist eine debug-Nachricht, die Sie nicht manuell rollback (aber haben, um die Transaktion rollback). Sollte nicht Ihr problem sein, wie bereits erwähnt, überprüfen Sie Ihre Datenbank. Was ich vermisse in deinem stacktrace ist etwas, das darauf hinweist, dass der Frühling ist Teil dieser Transaktion setup (ich sehe keinen Frühling transactioninterceptor oder ähnliches).
Transactioninterceptor ist nirgends zu sehen:/ was könnte es sein? warum der Frühling ist nicht Teil dieser Transaktion? Hat dieses Orchester hat alle weiteren erforderlichen Konfigurations -, dass wir noch nicht erwähnt habe in dem ursprünglichen Beitrag?
InformationsquelleAutor M. Deinum
Versuchen Sie dies: Auf Ihrem Transaktions-Manager hinzufügen:
Beispiel:
dann in Sie DAO-Implementierung etwas wie das hier tun:
InformationsquelleAutor tshenolo