Could not roll back JDBC transaction; nested exception is java.sql.SQLRecoverableException

在dbcp升級為dbcp2的過程中,部署到生产环境出现很多以下异常

[http-nio-8080-exec-72] org.apache.catalina.core.StandardWrapperValve.invoke 在路径为[/xxx]的上下文中,Servlet[dispatcher]的Servlet.service()引发了具有根本原因的异常[Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not roll back JDBC transaction; nested exception is java.sql.SQLRecoverableException: 关闭的连接]
	java.sql.SQLRecoverableException: 关闭的连接
		at oracle.jdbc.driver.PhysicalConnection.getAutoCommit(PhysicalConnection.java:2089)
		at oracle.jdbc.driver.PhysicalConnection.rollback(PhysicalConnection.java:2218)
		at org.apache.commons.dbcp2.DelegatingConnection.rollback(DelegatingConnection.java:781)
		at org.apache.commons.dbcp2.DelegatingConnection.rollback(DelegatingConnection.java:781)
		at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:294)
		at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:853)
		at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:830)
		at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:522)
		at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:286)
		at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
		at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
		at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
		at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
		at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)

目测应该是spring的事务管理和dbcp自动提交冲突,执行查询sql时间太长,dbcp超时回收连接,导致spring事务提交异常

google查询到附录1连接的说法是:回滚事务所用的连接是在执行测试方法之前就获取的

最终解决:增加时间,延缓dbcp连接池回收

removeAbandonedTimeout 为300
timeBetweenEvictionRunsMillis 为300000

debug记录:连接池和事务引发的bug - 六道漫步的博客 | Liudaomanbu Blog

https://www.51cto.com/article/607016.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值