Hikari CP连接池连接暴增,求助定位泄漏关联SQL
定位Hikari连接池泄漏与关联SQL的方法
1. 开启Hikari连接泄漏检测
在Hikari配置中添加参数,让连接池自动追踪未归还的连接并打印调用栈:
# 超过30秒未归还连接则记录泄漏日志 spring.datasource.hikari.leak-detection-threshold=30000
开启后,当连接超期未归还,Hikari会在日志中输出该连接的获取调用栈,结合Hibernate的SQL日志即可对应到具体业务代码和执行SQL。
2. 增强Hibernate SQL日志粒度
调整日志级别,打印SQL语句、绑定参数及事务边界:
# 打印SQL语句与参数 logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE # 打印事务开启/关闭日志,关联@Transactional方法 logging.level.org.hibernate.engine.transaction.internal.TransactionImpl=DEBUG
通过日志可将SQL执行与事务生命周期关联,排查事务未正确提交/回滚导致的连接未释放问题。
3. 用Hibernate拦截器关联SQL与连接
自定义StatementInspector拦截所有SQL执行,将SQL与连接ID绑定记录:
public class SqlTrackingInspector implements StatementInspector { @Override public String inspect(String sql) { Connection conn = SessionFactoryUtils.getSession(sessionFactory, false).connection(); String connId = conn.toString().split("@")[1]; // 输出连接ID与对应SQL到日志 System.out.printf("Connection %s executing SQL: %s%n", connId, sql); return sql; } }
在Hibernate配置中注册拦截器:
spring.jpa.properties.hibernate.session_factory.statement_inspector=com.yourpackage.SqlTrackingInspector
4. 排查@Transactional误用场景
以下情况可能导致连接长期占用:
@Transactional方法中存在远程调用、IO等待等阻塞操作- 事务传播配置错误(如滥用
REQUIRES_NEW导致大量新事务创建) - 异常未被正确捕获,事务未回滚导致连接未归还
结合日志中的事务ID与连接ID,对比阻塞操作时间段,定位对应业务方法。
5. 线程栈直接分析
连接池耗尽时,导出JVM线程栈(jstack <pid>),查找持有Hikari连接的线程。线程栈会包含Hibernate调用栈及SQL执行相关信息,直接定位业务代码位置。
内容的提问来源于stack exchange,提问作者Aarne Avialaynen
相关产品推荐
相关产品推荐

