You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调整Tomcat配置避免JDBC连接池耗尽的方案咨询

Tomcat JDBC连接池PoolExhaustedException问题排查与优化建议

异常信息

2023-04-16 20:46:20,104 ERROR Exception occurred 36032
org.apache.tomcat.jdbc.pool.PoolExhaustedException: [https-jsse-nio]
Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none
available [size:200; busy:200; idle:0; lastwait:30000]
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:738)

可检查的配置与排查方向

  • 完善遗弃连接回收配置:仅设置removeAbandoned=true无法精准回收泄漏连接,需配合removeAbandonedTimeout(默认60秒),根据业务最长操作时长调整阈值(如设为120秒);开启logAbandoned=true,该配置会记录连接获取的完整堆栈,当连接被判定为遗弃时打印调用链,直接定位未释放连接的代码位置。
  • 优化连接有效性检测策略:启用testWhileIdle=true,并配置timeBetweenEvictionRunsMillis=60000(1分钟),定期检测空闲连接可用性,同时清理长期闲置的连接;确保validationQuery为轻量有效语句(如MySQL用SELECT 1),避免验证逻辑占用额外资源。
  • 排查连接占用根源:
    • 数据库层面:执行show processlist(MySQL)等命令,查看是否存在长事务、慢SQL导致连接被长时间占用,比如未提交的事务或运行超时的查询。
    • 应用层面:检查代码中Connection的释放逻辑,确保所有连接获取操作都在finally块中执行close(),避免异常分支遗漏资源释放;用jstack导出线程栈,排查是否存在线程死锁,导致持有连接的线程无法执行释放操作。
  • 调整连接池核心参数:
    • 评估maxActive=200是否合理:结合业务并发量和数据库承载能力判断,若数据库无法支撑200并发连接,需下调该值,同时优化业务逻辑减少并发连接需求。
    • 检查maxWait:当前为30秒,若业务高峰确实需要更长等待时间可适当调整,但核心还是解决连接被占用的问题,而非单纯延长等待。
  • 事务配置检查:查看全局或局部事务的超时设置(如Spring @Transactional的timeout属性),避免事务超时过长导致连接长期占用;检查代码中是否存在捕获异常后未手动回滚事务的情况,确保事务最终会提交或回滚,释放绑定的连接。

内容的提问来源于stack exchange,提问作者Dice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:35:20