记一次Thinkphp5.1框架mysql数据库崩溃(SQLSTATE [08004] Too many connections)
故事要从笔者手上的一个项目说起,最近项目有了新的需求,在更新需求的时候,遇到了一个一直以来困扰笔者的状况,如下如:
由于技术经验有限,百度了许多关于这方面的案例,基本上都类似于
修改mysql目录下的my.ini,约在42行下方加入max_connections = 1000 。重启mysql就行。
Mysql达到连接数上限了,修改一下mysql的配置即可。
show variables like ‘%max_connections%’;
set global max_connections = 5000;
这样的答案,虽然可以缓解当下情况,但是终究没有解决本质的问题,而且笔者的情况比较特殊,在该项目中只承担了部分任务,无法修改my.ini配置及重启mysql这类修改系统的操作,经过一天的摸索,问题终于得到了解决。
首先,给自己科普了一下关于数据库的知识,mark!
**长连接:**长连接是相对于短连接来说的。长连接指在一个连接上可以连续发送多个数据包,在连接保持期间,如果没有数据包发送,需要双方发链路检测包。mysql的长连接如果长期闲置,mysql会8小时后(默认时间)主动断开该连接。
**短连接:**是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。
连接的区别:
使用长连接,短连接各有优势,也各有缺点。我们看看长短连接,系统是怎么做的?
1、短连接:
客户端连接–创建socket认证连接–维护连接–数据传输–关闭连接
2、长连接
客户端连接–创建socket认证连接–维护连接–数据传输–维护连接–数据传输…-关闭连接
2种连接方式都需要系统开销来维护连接,哪种连接最合适并没有准确的说法,主要还是看你客户端的行为。
笔者出现too many connection问题是有一个周期性任务,每半分钟一次,类似于消息队列,会产生大量睡眠连接占用mysql资源,导致其无法提供连接而报错,ThinkPHP5.1默认数据库连接为短链接,出现大量睡眠连接也是出乎笔者预料。
其次,在自己租的阿里云服务器进行了一番测试,这是优化前的mysql进程,发现存在大量sleep状态下的进程:
————————————————
根据当前需求,尝试使用长连接:
ThinkPHP5.1设置数据库长连接
在config目录下的database.php文件中将parma字段修改为:
// 数据库连接参数
'params' => [
\PDO::ATTR_PERSISTENT => true,
\PDO::ATTR_CASE => \PDO::CASE_LOWER,
],
数据库连接,断线再连
// 是否需要断线重连
'break_reconnect' => true,
优化后,效果如下:
mysql优化后
经过优化,数据库可以正常使用。
————————————————
版权声明:本文为CSDN博主「换你睡床右边」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zdy_lyq/article/details/93139961
本文由 我爱PHP169 作者:admin 发表,其版权均为 我爱PHP169 所有,文章内容系作者个人观点,不代表 我爱PHP169 对观点赞同或支持。如需转载,请注明文章来源。