HikariCP闲置连接未释放致连接池耗尽问题排查
从你的配置和日志来看,核心问题是HikariCP连接池中的空闲连接未被复用,且无法被正常回收,最终导致连接池耗尽超时。结合你提供的信息,我整理了几个关键排查点和解决方案:
1. 连接有效性验证缺失导致连接无法复用
你的HikariCP初始化日志显示:
connectionTestQuery.............none jdbc4ConnectionTest.............false
PostgreSQL在连接空闲一段时间后,可能会主动断开连接(受tcp_keepalives等参数影响)。由于你没有配置连接有效性验证,HikariCP无法识别这些失效的空闲连接,当请求过来时,拿到失效连接会直接丢弃并新建连接,旧的失效连接却一直留在池中,最终占满maximumPoolSize。
解决方案:
添加连接测试查询,让HikariCP在获取连接时验证有效性:
spring.datasource.hikari.connectionTestQuery=SELECT 1 spring.datasource.hikari.jdbc4ConnectionTest=true
jdbc4ConnectionTest=true会让HikariCP使用JDBC4的isValid()方法验证连接,配合connectionTestQuery作为 fallback,确保连接可用。
2. 事务与连接释放的状态不一致
日志中出现的Executed rollback on connection ... due to dirty commit state on close()是关键线索:
这说明连接归还到池时,事务状态未被正确清理(既未提交也未回滚),HikariCP被迫自动回滚。这种情况会导致连接被标记为"脏",无法被后续请求复用,只能一直留在池中直到
maxLifetime到期。
结合你提到的Hibernate事务日志顺序异常(先出现连接回滚,后发起事务提交),可能是事务管理与Hibernate连接释放逻辑冲突。
解决方案:
- 统一HikariCP和Hibernate的自动提交配置,确保两者一致:
# 确保Hibernate自动提交与Hikari一致(你的Hikari autoCommit为true) spring.jpa.properties.hibernate.connection.autocommit=true - 调整Hibernate的连接释放模式,强制事务结束后立即归还连接:
这个配置会让Hibernate在事务完成后立即将连接归还到池,避免连接长期占用。spring.jpa.properties.hibernate.connection.release_mode=after_transaction
3. 潜在的连接泄漏场景
虽然你看到Hibernate有释放连接的日志,但仍存在泄漏可能:
- 检查代码中是否有手动获取JDBC连接的场景(比如直接通过
DataSource.getConnection()),且未用try-with-resources确保关闭:// 错误示例:未关闭连接 Connection conn = dataSource.getConnection(); // ... 操作 // 缺少conn.close()或try-with-resources - 检查是否有未正确关闭的EntityManager,比如在异步方法、异常分支中遗漏了关闭逻辑:
// 确保用try-with-resources管理EntityManager try (EntityManager em = entityManagerFactory.createEntityManager()) { // ... 操作 }
4. 版本兼容性问题
你使用的HikariCP 2.7.8和Spring Boot 1.5.6存在一些已知的连接管理bug,比如连接回收逻辑的缺陷。
解决方案:
升级HikariCP到兼容Spring Boot 1.5.x的最新稳定版(比如2.9.0),在pom.xml中覆盖版本:
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>2.9.0</version> </dependency>
验证步骤
- 应用上述配置后,重启服务并观察HikariCP日志,查看是否有
SpringBootJPAHikariCP - Added connection org.postgresql.jdbc.PgConnection@xxx和SpringBootJPAHikariCP - Closing idle connection org.postgresql.jdbc.PgConnection@xxx的日志,确认连接被正常创建和回收。 - 监控连接池状态,可通过JMX查看HikariCP的指标(
registerMbeans=true开启),观察activeConnections和idleConnections的变化是否符合预期。
内容的提问来源于stack exchange,提问作者Saif

