数据库连接数耗尽排查

2026-01-09 15:33:07 834

欢迎来到8455线路检测中心技术小课堂。


一、快速确认与临时处理

 

1. 查看当前连接状态

-- 查看最大连接数配置
SHOW VARIABLES LIKE 'max_connections';

-- 查看当前已连接数
SHOW STATUS LIKE 'Threads_connected';

-- 查看历史峰值连接数
SHOW STATUS LIKE 'Max_used_connections';

-- 查看所有连接详情
SHOW PROCESSLIST;

 

2. 临时提高连接上限

-- 临时调整(立即生效,重启失效)
SET GLOBAL max_connections = 500;

-- 持久化调整(重启后仍生效)
SET PERSIST max_connections = 500;

 

3. 手动释放异常连接

-- 终止指定连接(从SHOW PROCESSLIST获取process_id)
KILL 12345;

 

 

二、数据库端配置优化

 

1. 修改配置文件(my.cnf/my.ini)

[mysqld]
max_connections = 500           # 根据内存和业务负载调整
wait_timeout = 300              # 空闲连接5分钟后回收
interactive_timeout = 300       # 交互连接超时时间

 

2. 连接超时与回收策略

 

wait_timeout:控制非交互连接的空闲超时

 

interactive_timeout:控制交互连接的空闲超时

 

建议值:300-600秒(5-10分钟),避免连接长时间空闲占用资源

 

 

三、应用端连接池配置

 

1. 连接池关键参数(以Druid为例)

# 最大活跃连接数(根据业务并发调整)
spring.datasource.druid.max-active=50

# 初始连接数
spring.datasource.druid.initial-size=5

# 最小空闲连接数
spring.datasource.druid.min-idle=5

# 获取连接最大等待时间(毫秒)
spring.datasource.druid.max-wait=3000

# 连接泄漏检测
spring.datasource.druid.remove-abandoned=true
spring.datasource.druid.remove-abandoned-timeout=60
spring.datasource.druid.log-abandoned-connections=true

 

2. 连接池配置原则

 

最大连接数:不超过数据库实例规格的80%,避免压垮数据库

最小空闲连接:保持5-10个空闲连接,减少创建开销

超时时间:连接获取超时30秒,空闲回收5分钟

泄漏检测:启用连接泄漏检测,超时未归还自动回收

 

 

四、连接泄漏排查与治理

 

1. 连接泄漏表现

 

连接数持续上升,即使业务低峰期也不下降

应用重启后连接数恢复正常,但运行一段时间后再次耗尽

监控显示活跃连接数长期接近最大值

 

2. 排查方法

 

代码审查:检查Connection、Statement、ResultSet是否在finally块或try-with-resources中正确关闭

 

事务管理:避免长事务占用连接,确保事务及时提交/回滚

 

连接池监控:监控活跃连接数、空闲连接数、等待获取连接的请求数

 

线程dump分析:抓取应用线程dump,定位哪个请求在占用连接

 

 

3. 治理措施

 

启用连接池的泄漏检测功能(如HikariCP的leakDetectionThreshold)

设置合理的连接空闲超时时间,自动回收长时间未使用的连接

定期执行压力测试,观察连接数变化趋势

 

8455线路检测中心官网上拥有完善的技术支持库可供参考,大家可自行查阅,更多技术问题,可以直接咨询。同时,8455线路检测中心整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。

更多技术知识,8455线路检测中心期待与你一起探索。


提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题:
XML 地图