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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:02:02