Hi Folks,
trying to set up Atomikos Tx Manager i'm confrontated with strange exceptions
(I've to use Atomikos because we've to use JBoss Cache for clustering issues).
First of all, the used stuff:
- Spring 2.5.5
- Hibernate Core 3.3.1.GA
- Hibernate Entitity Manager 3.4.0.GA
- Hibernate Annotations 3.4.0.GA
- Hibernate jbosscache2 3.3.1.GA
- Atomikos Transactions Essentials 3.5.1
- MySQL JDBC Connector 5.0.8 (for local MySQL) or jTDS 1.2.2 (MS SQl Server 2005)
- running in Tomcat 5.5.26
During little load, no problems are observed, but then my system starts to generate load (there are a bunch of threads started which process data and insert them into the DB in the background) those Exceptions are observed. They are the same on MySQL or MS SQL, only the stacktrace changes in the root cause classes are different (exceptions comming from jTDS instead of mysql jdbc driver):
Code:
java.sql.SQLException: Can't call commit when autocommit=true
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:914)
at com.mysql.jdbc.Connection.commit(Connection.java:2275)
at com.atomikos.jdbc.nonxa.AtomikosThreadLocalConnection.transactionTerminated(AtomikosThreadLocalConnection.java:347)
at com.atomikos.jdbc.nonxa.AtomikosNonXAParticipant.commit(AtomikosNonXAParticipant.java:112)
at com.atomikos.icatch.imp.CommitMessage.send(CommitMessage.java:94)
at com.atomikos.icatch.imp.PropagationMessage.submit(PropagationMessage.java:86)
at com.atomikos.icatch.imp.Propagator$PropagatorThread.run(Propagator.java:62)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
This is strange, because autocommit is disabled explicitly and the exception dosn't occour on all commits.
Most of the time, I got these:
Code:
09-02-19 10:03:25,750 [Atomikos:14] Error in non-XA commit
com.atomikos.jdbc.AtomikosSQLException: Error in commit on vendor connection
at com.atomikos.jdbc.AtomikosSQLException.throwAtomikosSQLException(AtomikosSQLException.java:19)
at com.atomikos.jdbc.nonxa.AtomikosThreadLocalConnection.transactionTerminated(AtomikosThreadLocalConnection.java:358)
at com.atomikos.jdbc.nonxa.AtomikosNonXAParticipant.commit(AtomikosNonXAParticipant.java:112)
at com.atomikos.icatch.imp.CommitMessage.send(CommitMessage.java:94)
at com.atomikos.icatch.imp.PropagationMessage.submit(PropagationMessage.java:86)
at com.atomikos.icatch.imp.Propagator$PropagatorThread.run(Propagator.java:62)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:888)
at com.mysql.jdbc.Connection.getMutex(Connection.java:3714)
at com.mysql.jdbc.Connection.commit(Connection.java:2268)
at com.atomikos.jdbc.nonxa.AtomikosThreadLocalConnection.transactionTerminated(AtomikosThreadLocalConnection.java:347)
... 7 more
followed by:
Code:
09-02-19 10:03:26,203 [Atomikos:14] Unexpected error in commit
com.atomikos.icatch.HeurHazardException: Heuristic Exception
at com.atomikos.jdbc.nonxa.AtomikosNonXAParticipant.commit(AtomikosNonXAParticipant.java:115)
at com.atomikos.icatch.imp.CommitMessage.send(CommitMessage.java:94)
at com.atomikos.icatch.imp.PropagationMessage.submit(PropagationMessage.java:86)
at com.atomikos.icatch.imp.Propagator$PropagatorThread.run(Propagator.java:62)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Here's my actual configuration. I've tried everything which I found, but without any significant change:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<context:property-placeholder location="classpath:dbaccess.properties"/>
<tx:annotation-driven transaction-manager="txManager" />
<bean id="autoProxyCreator"
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
</bean>
<bean id="datasource"
class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean">
<property name="uniqueResourceName" value="NONXADBMS" />
<property name="user" value="${db.username}" />
<property name="password" value="${db.password}"/>
<property name="url" value="${db.url}"/>
<property name="driverClassName" value="${db.driverClassName}" />
<property name="poolSize" value="100" />
<property name="borrowConnectionTimeout" value="120" />
<property name="testQuery" value="SELECT 1" />
<property name="reapTimeout" value="0" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath:los-persistence-jta.xml" />
<property name="dataSource" ref="datasource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="${db.database}" />
<property name="generateDdl" value="${db.generateDdl}" />
<property name="showSql" value="${db.showSql}" />
<property name="databasePlatform" value="${db.databasePlatform}" />
</bean>
</property>
<property name="jpaPropertyMap">
<map>
<entry key="hibernate.cache.use_second_level_cache" value="${hb.use_second_level_cache}"/>
<entry key="hibernate.cache.use_query_cache" value="${hb.use_query_cache}"/>
<entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.MultiplexedJBossCacheRegionFactory"/>
<entry key="hibernate.cache.region.jbc2.configs" value="${hb.jbc2.configs}" />
<entry key="hibernate.cache.region.jbc2.cfg.entity" value="${hb.jbc2.entity}" />
<entry key="hibernate.transaction.manager_lookup_class" value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/>
<entry key="hibernate.hbm2ddl.auto" value="${db.ddl-create}"/>
<entry key="hibernate.connection.autocommit" value="false" />
<entry key="hibernate.connection.release_mode" value="after_transaction"/> <!-- Tried after_statement, too -->
</map>
</property>
</bean>
<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp" init-method="init" destroy-method="shutdownForce">
<constructor-arg>
<props>
<prop key="com.atomikos.icatch.service">com.atomikos.icatch.standalone.UserTransactionServiceFactory</prop>
<prop key="com.atomikos.icatch.max_timeout">3600000</prop>
<prop key="com.atomikos.icatch.default_jta_timeout">3600000</prop>
<prop key="com.atomikos.icatch.max_actives ">200</prop>
</props>
</constructor-arg>
</bean>
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close" depends-on="userTransactionService">
<property name="startupTransactionService" value="true"/>
<property name="forceShutdown" value="false" />
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" depends-on="userTransactionService">
<property name="transactionTimeout" value="3600000" />
</bean>
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager"><ref bean="atomikosTransactionManager" /></property>
<property name="userTransaction"><ref bean="atomikosUserTransaction" /></property>
<property name="transactionSynchronizationName" value="SYNCHRONIZATION_ON_ACTUAL_TRANSACTION"/>
</bean>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
</beans>
Some additional words:
- The Hibernate 2nd lvl Cache is disabled.
- Then I switch my configuration too the good old Spring Tx Manager, everything works fine (using dbcp as the connection pool)
It looks like that "something" is closing the connection which is used by the current transaction, maybe Hibernate (but set hibernate.connection.release_mode" value="after_transaction") or the connection pool (I'm using AtomikosNonXADataSourceBean).
Any suggestion and/or help is welcome!!!
Is there any other alternative to Atomikos? JOTM is a bit old and AFAIK not supported anymore.
Bye
HGU