现象: 会报错过多连接,超过默认最大值(151)
原因:
1.使用了太多持久连接(个人觉得,在高并发系统中,不适合使用持久连接)
2.程序中,没有及时关闭mysql连接
3.数据库查询不够优化,过度耗时。
STP1. 在workbench或者msql命令行工具 输入show full processlist,可以发现很多Sleep的线程ID
STEP2: 输出需要kill的任务
SELECT GROUP_CONCAT(CONCAT('kill ',id) SEPARATOR '; ') AS cmd FROM information_schema.processlist
WHERE USER='root'
AND command='Sleep'
AND db='YourDBName'
STEP3: 执行STEP2生成的内容,即执行kill
kill 5040; kill 5128; kill 5136; kill 5056; kill 5184; kill 5088; kill 5144; kill 5152; kill 5160; kill 5096; kill 5256; kill 5041; kill 5129; kill 5137; kill 5057; kill 5025; kill 5089; kill 5153; kill 5161; kill 5145; kill 5185; kill 5105; kill 5257; kill 5249; kill 5034; kill 5122; kill 5058; kill 5090; kill 4778; kill 5154; kill 5162; kill 5170; kill 5186; kill 5098; kill 5106; kill 5250; kill 5258; kill 5035; kill 2059; kill 5091; kill 5123; kill 5131; kill 5139; kill 5059; kill 5155; kill 5163; kill 5171; kill 5099; kill 5203; kill 5259; kill 5036; kill 2060; kill 5132; kill 5140; kill 5092; kill 5156; kill 5164; kill 5172; kill 5188; kill 5100; kill 5108; kill 5204; kill 5037; kill 5181; kill 5125; kill 5133; kill 5141; kill 5069; kill 5149; kill 5157; kill 4989; kill 5189; kill 5093; kill 5101; kill 5173; kill 5253; kill 5126; kill 5054; kill 5158; kill 5190; kill 5094; kill 5102; kill 5254; kill 5047; kill 5183; kill 5127; kill 5135; kill 4903; kill 5055; kill 5143; kill 5159; kill 5095; kill 5103;
从长远看,
1.查看代码是否每一次都有conn.close(),尤其是有一些代码出了异常后没有进行close
2.需要优化长连接时间:
SET GLOBAL interactive_timeout=120;
SET GLOBAL mysqlx_interactive_timeout=120;
SET GLOBAL wait_timeout=120;
SET GLOBAL mysqlx_wait_timeout=120;
SHOW variables like '%timeout';
wait_timeout — 指的是mysql在关闭一个非交互的连接之前所要等待的秒数,其取值范围为1-2147483(Windows),1-31536000(linux),默认值28800。
interactive_timeout — 指的是mysql在关闭一个交互的连接之前所要等待的秒数(交互连接如mysql gui tool中的连接),其取值范围随wait_timeout变动,默认值28800。
3.查看并设置最大连接数
SHOW variables like '%max_connections%';
SET GLOBAL max_connections = 15000;
SET GLOBAL mysqlx_max_connections = 15000;