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

故事要从笔者手上的一个项目说起,最近项目有了新的需求,在更新需求的时候,遇到了一个一直以来困扰笔者的状况,如下如:
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状态下的进程:
mysql优化前
根据当前需求,尝试使用长连接:
ThinkPHP5.1设置数据库长连接
在config目录下的database.php文件中将parma字段修改为:

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

数据库连接,断线再连

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

优化后,效果如下:
mysql优化后
经过优化,数据库可以正常使用。

发布了13 篇原创文章 · 获赞 9 · 访问量 3517

猜你喜欢

转载自blog.csdn.net/zdy_lyq/article/details/93139961