[ 
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.

Reply via email to