mysql报Communications link failure的处理办法

来源:V型知识库 2018年08月31日 14:30 浏览:3798

最近本人网站老是死掉,几乎每隔8小时死掉一次,然后查看了下日志,报错如下:

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 0 ms ago

从中看到了一条非常重要的报错信息,那就是:

Communications link failure

故上网查了下,遇到这样问题的人还真多,给出的解决办法也很多,最主要是关于mysql的机制,资料如下:

MySQL服务器默认的“wait_timeout”是28800秒即8小时,意味着如果一个连接的空闲时间超过8个小时,MySQL将自动断开该连接,而连接池却认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错。 

解决办法:

修改MySQL的参数,wait_timeout最大为31536000即1年,在my.cnf中加入: 

[mysqld] 

wait_timeout=31536000 

interactive_timeout=31536000 

重启生效,需要同时修改这两个参数

重启mysql数据库的指令为:

#service mysqld restart

但是本人把上述两个参数设置放在了my.cnf文件的最后位置,并没有放在[mysqld] 后面,然后发现第二天网站又死了,不得不再次重启mysql,然后登陆mysql数据库,执行如下语句

show variables like "%timeout%"

发现wait_timeout的值还是28800秒(8小时),并没有更改过来,如下图

然后继续查询my.cnf配置文件,发现设置的两个参数写在了文件的最后,而不是[mysqld]  的后面,  故而没有生效,所以调整

wait_timeout=31536000 

interactive_timeout=31536000 

两个参数的位置到[mysqld]后面,重启mysql数据库,然后查询发现已生效

但是,修改成功后,观察了一天,发现网站又死了,还是出现上述情况,然后仔细回顾了网站最近修改了什么,因为以前从未发生过这种异常,最近一周每天都会发生,突然想起自己一周前曾经把数据库连接地址由ip修改成了localhost,索性死马当活马医,把localhost改成127.0.0.1,观察了三天居然不在报错,网站也没有再死掉,怪事,不知什么原因,不过总归解决了,从网上论坛有人说把ip改成localhost,而我是反过来就好了。