[ https://issues.apache.org/jira/browse/IBATIS-560?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jeff Butler closed IBATIS-560. ------------------------------ Resolution: Invalid Not a bug. Use the "commitRequired" attribute on the <transactionManager> element. This is specifically documented for WebSphere on pages 11-12 of the developer's guide. > 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.