MySQL为什么莫名其妙的断开连接以及解决方案!

前言

近遇到在将本地的项目部署到服务器上之后遇到的一个奇怪问题

在部署完成后,网站当时可以正常工作,但是第二天访问网站的时候却会遇到一个500 Server Error。

从日志中可以看出是MySQL数据库出现了异常

翻译如下:

后一个数据包在 83827560 ms 之前被成功接收,后一个数据包在83827560 ms 之前被成功发送。比服务的配置参数wait_timeout的值要长。

日志中给出的建议如下

翻译如下:

你应考虑在程序中进行数据库操作之前检验数据库连接的有效性或者将数据库的autoReconnect属性设置为true来避免这个问题

关于wait_timeout和autoReconnect下面我们会依次分析介绍!

原因分析

我们进入mysql的命令行查询超时时间

28800单位是秒转化成小时就是8小时

看出MySQL的默认设置,当一个连接的空闲时间超过8小时后,MySQL就会断开该连接

所以发现问题出在如果超过这个wait_timeout时间(默认是8小时)对数据库没有任何操作,那么MySQL会自动关闭数据库连接以节省资源

数据库连接自动断开的问题确实是在第二天发生了,也就是在一个晚上没有对数据库进行操作(显然超过了8小时)的情况下发生的这个问题

大家用命令show processlist; 可以查看Sleep状态的进程Sleep,同时可以看到每个进程Sleep多久了:

下面介绍下解决和优化办法!

解决方法

1.autoReconnect

这个参数表示在mysql超时断开连接后会自动重新连接

配置的话,只需要在连接mysql的语句写上autoReconnect=true

jdbc:mysql://127.0.0.1:3306/stock_tweet?autoReconnect=true