sybase使用proxool后的SET CHAINED错误

阅读更多

        公司原来使用dbcp连接池连接数据库,但是在测试过程中发现dbcp存在连接未释放问题,导致数据库连接占满。

        之后在proxool和c3p0之间,我们选择了前者,因为前者在相对后者效率会高一些(网上资料,时间原因,未做验证)。

        产品支持多数据库,oracle下,一些正常,但是切换到sybase之后,程序启动开始报:

 

com.sybase.jdbc3.jdbc.SybSQLException: SET CHAINED command not allowed within multi-statement transaction.

	at com.sybase.jdbc3.tds.Tds.processEed(Tds.java:2942)
	at com.sybase.jdbc3.tds.Tds.nextResult(Tds.java:2246)
	at com.sybase.jdbc3.jdbc.ResultGetter.nextResult(ResultGetter.java:69)
	at com.sybase.jdbc3.jdbc.SybStatement.nextResult(SybStatement.java:220)
	at com.sybase.jdbc3.jdbc.SybStatement.nextResult(SybStatement.java:203)
	at com.sybase.jdbc3.jdbc.SybStatement.updateLoop(SybStatement.java:1804)
	at com.sybase.jdbc3.jdbc.SybStatement.executeUpdate(SybStatement.java:1787)
	at com.sybase.jdbc3.jdbc.SybPreparedStatement.executeUpdate(SybPreparedStatement.java:116)
	at com.sybase.jdbc3.tds.Tds.setOption(Tds.java:1278)
	at com.sybase.jdbc3.jdbc.SybConnection.setAutoCommit(SybConnection.java:1011)
	at org.logicalcobwebs.proxool.ConnectionResetter.reset(ConnectionResetter.java:288)
	at org.logicalcobwebs.proxool.ConnectionPool.resetConnection(ConnectionPool.java:918)
	at org.logicalcobwebs.proxool.ProxyConnection.close(ProxyConnection.java:237)
	at org.logicalcobwebs.proxool.WrappedConnection.invoke(WrappedConnection.java:134)
	at org.logicalcobwebs.proxool.WrappedConnection.intercept(WrappedConnection.java:87)
	at com.sybase.jdbcx.SybConnection$$EnhancerByProxool$$4880ae47.close()
	at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:313)
	at org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection(DataSourceUtils.java:274)
	at org.springframework.jdbc.datasource.DataSourceTransactionManager.doCleanupAfterCompletion(DataSourceTransactionManager.java:316)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.cleanupAfterCompletion(AbstractPlatformTransactionManager.java:989)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:782)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	at $Proxy26.queryByFilter(Unknown Source)

 

 

        根据网上的资料,该问题产生的原因是sybase开启事务后,需要手动的关闭事务,而项目新版本使用spring的事物管理,所以尚未找到由spirng提供的解决方案。

        搜索其他解决方案,有资料显示proxool需要配合使用jtds驱动,更换项目驱动,问题解决。

JTDS是一个开放源代码的100%纯Java的,用于JDBC 3.0驱动Microsoft SQL Server (6.5 ,7 ,2000和2005版本)和Sybase(10 ,11 ,12 ,15 版本)的驱动程序 。 JTDS是基于freetds的,并且是目前最快的生产准备JDBC驱动程序为SQL Server和Sybase 。 JTDS完全与JDBC 3.0兼容,支持只向前的,和可滚动/可更新的结果集(ResultSets)中并行(完全独立)语句,并且可实施所有databasemetadata和resultsetmetadata方法。

http://sourceforge.net/projects/jtds/

 

你可能感兴趣的:(sybase,SET,CHAINED,jtds,proxool)