欢迎您来到懒之才-站长的分享平台!   学会偷懒,并懒出境界是提高工作效率最有效的方法!
首页 >建站经验 >PHP > 记一次Thinkphp5.1框架mysql数据库崩溃(SQLSTATE [08004] Too many connections)

记一次Thinkphp5.1框架mysql数据库崩溃(SQLSTATE [08004] Too many connections)

2019-10-21 153 收藏 0 赞一个 0 真差劲 0 去评论

故事要从笔者手上的一个项目说起,最近项目有了新的需求,在更新需求的时候,遇到了一个一直以来困扰笔者的状况,如下如:

1.png

由于技术经验有限,百度了许多关于这方面的案例,基本上都类似于

 修改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状态下的进程:

2.png

根据当前需求,尝试使用长连接:

ThinkPHP5.1设置数据库长连接

在config目录下的database.php文件中将parma字段修改为:

// 数据库连接参数
    'params' => [
        \PDO::ATTR_PERSISTENT   => true,
        \PDO::ATTR_CASE         => \PDO::CASE_LOWER,
    ],

数据库连接,断线再连

// 是否需要断线重连
    'break_reconnect' => true,

优化后,效果如下:

3.png

经过优化,数据库可以正常使用。

一、推荐使用迅雷或快车等多线程下载软件下载本站资源。

二、未登录会员无法下载,登录后可获得更多便利功能,若未注册,请先注册。

三、如果服务器暂不能下载请稍后重试!总是不能下载,请点我报错 ,谢谢合作!

四、本站所有资源(包括模板、素材、软件、字体等)仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您自己承担!

五、如有其他问题,请加网站设计交流群(点击这里查看交流群 )进行交流。

六、如需转载本站资源,请注明转载来自并附带链接

七、本站部分资源为加密压缩文件,统一解压密码为:www.aizhanzhe.com

大家评论
分享是个好习惯