Transaction cleanup problem in WebSphere Application Server 6.1.0.19 (Root
cause already identified)
----------------------------------------------------------------------------------------------------
Key: IBATIS-560
URL: https://issues.apache.org/jira/browse/IBATIS-560
Project: iBatis for Java
Issue Type: Bug
Components: SQL Maps
Affects Versions: 2.3.4
Environment: WebSphere Application Server 6.1.0.19, Windows XP, DB2
v9.1
Reporter: LiuYang
We are using ibatis 2.3.4 in a struts 2 web app with IBM WebSphere Application
Server data source and DB2 v9.1. No spring or other framework involved.
The code we used is very simple like the following:
SqlMapClient sqlMapper = null;
try {
Reader reader =
Resources.getResourceAsReader("com/mydomain/data/SqlMapConfig.xml");
sqlMapper =
SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
throw new RuntimeException("Something bad happened
while building the SqlMapClient instance." + e, e);
}
try {
sqlMapper.startTransaction();
//some work
sqlMapper.commitTransaction();
} catch (SQLException e) {
//some error handling
}finally{
try { sqlMapper.endTransaction(); } catch (SQLException e1) {
e1.printStackTrace(); }
}
The transaction manager definition is the following:
<transactionManager type="JDBC">
<dataSource type="JNDI">
<property name="DataSource" value="jdbc/test" />
<!-- we use DB2 v9.1 type 4 driver to define
this data source -->
</dataSource>
</transactionManager>
We found that if our db operation is complex (some update, search, insert), our
app works correctly. But if we only do the query, we will meet with the
following exception:
com.ibm.ws.exception.WsException: DSRA0080E: An exception was received by the
Data Store Adapter. See original exception message: Cannot call 'cleanup' on a
ManagedConnection while it is still in a transaction..
at
com.ibm.ws.rsadapter.exceptions.DataStoreAdapterException.<init>(DataStoreAdapterException.java:241)
at
com.ibm.ws.rsadapter.exceptions.DataStoreAdapterException.<init>(DataStoreAdapterException.java:190)
at
com.ibm.ws.rsadapter.AdapterUtil.createDataStoreAdapterException(AdapterUtil.java:353)
at
com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.cleanupTransactions(WSRdbManagedConnectionImpl.java:3702)
at
com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.cleanup(WSRdbManagedConnectionImpl.java:3298)
at com.ibm.ejs.j2c.MCWrapper.cleanup(MCWrapper.java:1449)
at com.ibm.ejs.j2c.FreePool.returnToFreePool(FreePool.java:485)
at com.ibm.ejs.j2c.PoolManager.release(PoolManager.java:1780)
at com.ibm.ejs.j2c.MCWrapper.releaseToPoolManager(MCWrapper.java:2281)
at
com.ibm.ejs.j2c.ConnectionEventListener.connectionClosed(ConnectionEventListener.java:324)
at
com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.processConnectionClosedEvent(WSRdbManagedConnectionImpl.java:1570)
at
com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.closeWrapper(WSJdbcConnection.java:816)
at
com.ibm.ws.rsadapter.jdbc.WSJccConnection.closeWrapper(WSJccConnection.java:724)
at com.ibm.ws.rsadapter.jdbc.WSJdbcObject.close(WSJdbcObject.java:181)
at com.ibm.ws.rsadapter.jdbc.WSJdbcObject.close(WSJdbcObject.java:140)
at
com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransaction.close(JdbcTransaction.java:86)
at
com.ibatis.sqlmap.engine.transaction.TransactionManager.end(TransactionManager.java:93)
at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.endTransaction(SqlMapExecutorDelegate.java:734)
at
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.endTransaction(SqlMapSessionImpl.java:176)
at
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.endTransaction(SqlMapClientImpl.java:153)
at com.mydomain.data.TestService.test(TestService.java:42)
at lius.HelloWorldAction.execute(HelloWorldAction.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:618)
at
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
at
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
at
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
at
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
at
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at
com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at
com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
at
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
After several days debug, I found maybe the root cause is:
no connection.commit() before connection.close();
If the transaction only contains select clause, ibatis WON'T call
connection.commit() even we called sqlMapper.commitTransaction().
I've debuged using ibatis source code and proved this.
It would be great if this could be fixed since our work around now is to use
sqlMapper.setUserConnection() which will bypass transaction management of
Ibatis.
Thanks a lot.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.