记一次数据库连接池耗尽的排查

Mei Lin | 2026-08-27T06:33:00 | Spring Boot, Database

HikariCP连接池耗尽导致服务不可用,从监控到定位连接泄漏的完整排查过程

# 记一次数据库连接池耗尽的排查 某天下午接口突然超时,日志里全是`Connection is not available, request timed out after 30000ms`。HikariCP连接池被榨干了。 ## 排查过程 **第一步:看监控** ```yaml # 先开启HikariCP的监控指标 spring: datasource: hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 30000 leak-detection-threshold: 60000 # 超过60秒未归还就报警 ``` 发现active connections一直是20(满了),idle是0。 **第二步:找泄漏** 开启了`leak-detection-threshold`后,日志里出现了: ``` Connection leak detection triggered for connection xxx, stack trace follows: at com.example.service.ReportService.generateReport(ReportService.java:45) ``` **第三步:定位代码** ```java // 问题代码:手动获取连接但没释放 public void generateReport() { Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); // 处理结果... // 忘记关闭连接了!异常时更不会关 } // 修复:用try-with-resources public void generateReport() { try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { // 处理结果... } // 自动关闭,即使异常也不会泄漏 } ``` 总结:`leak-detection-threshold`是排查连接泄漏的神器,生产环境建议始终开启。另外能用Spring的`JdbcTemplate`就别手动管连接。

← Back to Blog