commons-dbcp2调用rollback触发StackOverFlowError循环调用问题求助
问题根因说明
这是commons-dbcp2 2.6.0版本的已知内部bug,由toString方法循环调用直接导致。
触发逻辑
你提交的错误栈完全匹配该问题的典型特征:
org.apache.commons.pool2.impl.GenericKeyedObjectPool的toStringAppendFields方法执行时,会输出持有的连接对象详情,触发PoolingConnection的toString方法org.apache.commons.dbcp2.PoolingConnection的toString方法执行时,又会反向输出关联的连接池对象详情,再次触发GenericKeyedObjectPool的toString逻辑
二者形成无限循环调用,栈深度超过JVM限制后就会抛出StackOverflowError。通常该问题会在事务回滚、连接状态异常时触发,此时dbcp2内部会打印包含连接/连接池信息的日志,进而触发两个类的toString互相调用。
解决方案
- 根因修复方案:直接将commons-dbcp2升级到2.7.0及以上版本即可,官方已在该版本修复了
toString循环调用的问题,无需修改现有业务代码,也不需要连带升级Hibernate、commons-io等无关依赖。 - 临时规避方案:如果暂时无法完成依赖升级,可以调整日志配置,将
org.apache.commons.dbcp2、org.apache.commons.pool2包的日志级别调整为WARN及以上,避免触发包含对象详情的低级别日志打印,可临时避免问题触发,但无法从根本上解决问题,建议尽快完成依赖升级。
内容的提问来源于stack exchange,提问作者dowonderatwill
相关产品推荐
相关产品推荐

