我有一个非常大的交易,用@Transactional
注释。其中有一些长时间运行的查询,但通常运行正常。大约20%的时间Connection
似乎在事务之外被强制关闭,并且当事务尝试继续工作时,它会因以下堆栈跟踪而失败。更糟糕的是,交易没有回滚。
默认情况下,JDBC在连接关闭时提交。但是,Spring应该在打开事务(Spring @Transactional and JDBC autoCommit)之前使用类似下面的内容将Connection的自动提交设置为false。我已经确认我们使用的版本仍然会这样做。我们使用SimpleJdbcTemplate
来执行查询,并从Apache Commons DBCP
池中获取连接。
这是DBCP认为连接是否陈旧的问题(因为事务中有一些长时间运行的查询),所以池试图回收连接,一路上提交它?不应该autocommit = false阻止这个吗?有人有任何其他建议吗?
由于
使用(全部很旧):
SpringJDBC 2.5
Oracle JDBC Drivers 11.1.0.7 (ojdbc6)
Apache Commons DBCP 1.2.1
堆栈追踪:
Activity threw exception:
org.springframework.transaction.TransactionSystemException: Could not roll back JDBC transaction; nested exception is java.sql.SQLException: Connection oracle.jdbc.driver.T4CConnection@56a2191a is closed.
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:279)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:800)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:777)
at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:339)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
[...]
Caused by: java.sql.SQLException: Connection oracle.jdbc.driver.T4CConnection@56a2191a is closed.
at org.apache.commons.dbcp.DelegatingConnection.checkOpen(DelegatingConnection.java:398)
at org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:368)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.rollback(PoolingDataSource.java:323)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:276)
... 21 more