数据库连接池泄漏排查:一条 getConnection 忘 close 的蝴蝶效应
引言 凌晨两点,告警短信把运维叫醒:order-service HikariPool-1 - Connection is not available, request timed out after 30000ms。登上服务器一看,20 个数据库连接全部 active,但数据库 processlist 里一半连接在 Sleep、没有任何 SQL 在执行——连接被借走了,却没有在跑查询,也没有归还。重启服务后一切恢复正常,但第二天同一时间,告警再次响起。 这是典型的连接泄漏(Connection Leak):代码从池里借走连接后,因为异常分支、提前 return、手动取连接等原因没有 close,连接永远不会回到池中。它和"慢 SQL 占满连接池"症状相似但根因完全不同——慢 SQL 是连接在用但用得久(processlist 能看到正在执行的语句),泄漏是连接"人间蒸发"(processlist 显示 Sleep,池却显示 active)。更阴险的是它的累积特性:代码每天只泄漏两三个连接,但池总共只有 20 个,一周后池就被抽空,而且时间点毫无规律,重启只能续命。这篇文章完整复盘一次真....