一次异常java.sql.SQLRecoverableException: Closed Statement
环境:springboot2 + oracle + druid + mybatis
依赖包:
<dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.28</version> </dependency>
问题现象及报错信息
报错的sql并没有语法错误,使用连接池也不存在连接关闭的情况
### Cause: java.sql.SQLRecoverableException: Closed Statement ; Closed Statement; nested exception is java.sql.SQLRecoverableException: Closed Statement at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:100) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:88) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440) at com.sun.proxy.$Proxy66.insert(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:271) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62) at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:152) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85) at com.sun.proxy.$Proxy67.addXbkConfigLog(Unknown Source) at com.xbkconfig.common.AsyncCommon.addXbkConfigLog(AsyncCommon.java:52) at com.xbkconfig.common.AsyncCommon$$FastClassBySpringCGLIB$$828e03bc.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) at com.xbkconfig.common.AsyncCommon$$EnhancerBySpringCGLIB$$506fb65d.addXbkConfigLog(<generated>) at com.xbkconfig.common.aop.AppCheckAop.around(AppCheckAop.java:65) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
原因及解决
1.0.28版本的druid连接池,执行了某条错误的sql后,会将报错信息保存在执行线程中,当下一条使用这条线程执行sql时,就不会正常执行sql了,而是会直接抛出异常
解决方法是升级连接池版本,我升级到1.0.29版本,目前运行正常
<dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.29</version> </dependency>
atomic的XA异常
现象:生产库上运行完全正常,在测试库测试的时候一直抛出XA异常
排查思路:
- 检查连接池配置,多次尝试无果
- 检查版本,与生产一致
- 百度查到是当前版本的oracle是商业版本,需要自行给用户开通XA支持
grant select on sys.dba_pending_transactions to <user name>;
grant select on sys.pending_trans$ to <user name>;
grant select on sys.dba_2pc_pending to <user name>;
grant execute on sys.dbms_system to <user name>;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~