在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