数据库连接池耗尽是运维常见的高危故障,本文提供三个关键命令助你快速恢复业务,并分析根本解决方案。

无论使用HikariCP、Tomcat JDBC还是其他语言连接池,当并发请求超过上限或连接未正确释放时,就会出现连接池耗尽的"雪崩效应"。面对这种紧急情况,掌握以下三个命令能帮你快速止血。
SHOW PROCESSLIST;
通过以下SQL可更直观统计连接状态:
SELECT command, COUNT(*)
FROM information_schema.processlist
GROUP BY command;
核心功能:快速掌握当前连接活动状态。Command列中Sleep代表空闲连接,Query表示正在执行SQL,Locked(MySQL 5.x)则说明连接被阻塞。
诊断要点:大量Sleep连接通常意味着存在连接泄漏问题。
-- 查询所有空闲超过60秒的连接ID
SELECT id, user, host, db, time
FROM information_schema.processlist
WHERE command = 'Sleep' AND time > 60;-- 批量生成kill语句
SELECT CONCAT('KILL ', id, ';')
FROM information_schema.processlist
WHERE command = 'Sleep' AND time > 60;
执行生成的KILL xxxx;语句时需注意:仅处理空闲连接,避免中断正在执行重要事务的Query连接。
实际效果:立即释放被占用的连接资源,这是最直接的应急处理方案。
若清理空闲连接后问题依旧,说明业务确实需要更多连接资源。
首先查看当前最大连接数设置:
SHOW VARIABLES LIKE 'max_connections';
再检查实际连接数:
SHOW STATUS LIKE 'Threads_connected';
当Threads_connected接近max_connections时,可临时调整参数(无需重启):
SET GLOBAL max_connections = 500; -- 根据服务器配置调整
执行应急措施后,还需排查根本原因。常见问题包括:
connection.close()。maximumPoolSize设置。彻底解决问题需要分析慢查询日志,使用APM工具追踪代码,并通过压力测试优化连接池配置。
许多小型团队面对数据库故障时经验不足,可能因操作不当引发二次事故。成熟的技术团队通常会建立完善的监控告警机制,并制定自动化处理流程:当连接数超限时,系统自动检测并清理空闲连接,必要时临时扩容,全程无需人工干预。同时通过定期慢查询分析和参数优化,从源头预防故障发生。