解决Mysql sleep线程过多导致堵塞问题
一.sleep连接过多,会对mysql服务器造成什么影响?
严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃。
二.造成睡眠连接过多的原因?
1.使用了太多持久连接(在高并发系统中,不适合使用持久连接)
2.程序中,没有及时关闭JDBC连接
3.数据库查询不够优化,过度耗时。
三.在Mysql层面,注意受如下两个参数控制:interactive_timeout和wait_timeout,详见:
https://www.cndba.cn/hbhe0316/article/22633
四.如下查看sleep线程
mysql> show processlist;
+----+------+---------------------+--------+---------+------+--------------+-------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+---------------------+--------+---------+------+--------------+-------------------------+
| 3 | root | localhost | mysql | Query | 0 | starting | show processlist |
| 5 | root | 192.168.56.88:43384 | testdb | Query | 4 | Sending data | select count(*) from t1 |
+----+------+---------------------+--------+---------+------+--------------+-------------------------+
2 rows in set (0.00 sec)
mysql> show processlist;
+----+------+---------------------+--------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+---------------------+--------+---------+------+----------+------------------+
| 3 | root | localhost | mysql | Query | 0 | starting | show processlist |
| 5 | root | 192.168.56.88:43384 | testdb | Sleep | 23 | | NULL |
+----+------+---------------------+--------+---------+------+----------+------------------+
2 rows in set (0.00 sec)
如上所示:当线程处于sleep的时候,Command列会显示Sleep关键字,由于设置了interactive_timeout和wait_timeout为300,那么300S后,原理的3和5的线程被kill。
mysql> show processlist;
+----+------+-----------+-------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+-------+---------+------+----------+------------------+
| 6 | root | localhost | mysql | Query | 0 | starting | show processlist |
+----+------+-----------+-------+---------+------+----------+------------------+
1 row in set (0.00 sec)
五.如何手动kill线程
mysql> show processlist;
+----+------+---------------------+--------+---------+------+--------------+-------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+---------------------+--------+---------+------+--------------+-------------------------+
| 7 | root | 192.168.56.88:43386 | testdb | Query | 3 | Sending data | select count(*) from t1 |
| 8 | root | localhost | mysql | Query | 0 | starting | show processlist |
+----+------+---------------------+--------+---------+------+--------------+-------------------------+
2 rows in set (0.01 sec)
mysql> kill 7;
Query OK, 0 rows affected (0.00 sec)
原文链接:https://www.cndba.cn/hbhe0316/article/22634
个人博客:http://www.qbeee.cn
分类:
SQL数据库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2016-07-17 板邓:mysql navicat设置字段默认时间为当前时间