.: Communications link failure

时间:2025-03-19 09:31:53

很长的报错,截取

ERROR  - discard connection
.: Communications link failure

The last packet successfully received from the server was 44,866 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.
	at .(Unknown Source) ~[na:na]
	at (:45) ~[na:1.7.0_79]
	at (:526) ~[na:1.7.0_79]
	at (:404) ~[mysql-connector-java-5.1.:5.1.38]
	at (:981) ~[mysql-connector-java-5.1.:5.1.38]
	at (:3465) ~[mysql-connector-java-5.1.:5.1.38]
	at (:3365) ~[mysql-connector-java-5.1.:5.1.38]
	at (:3805) ~[mysql-connector-java-5.1.:5.1.38]
	at (:2478) ~[mysql-connector-java-5.1.:5.1.38]
	at (:2625) ~[mysql-connector-java-5.1.:5.1.38]
	at (:2551) ~[mysql-connector-java-5.1.:5.1.38]
	at (:1861) ~[mysql-connector-java-5.1.:5.1.38]
	at (:1962) ~[mysql-connector-java-5.1.:5.1.38]
	at (:227) ~[druid-1.0.:1.0.5]
	at (:73) [jfinal-2.:na]
	at (:100) [jfinal-2.:na]
	at (:47) [jfinal-2.:na]
	...
	
Caused by: : Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
	at (:2957) ~[mysql-connector-java-5.1.:5.1.38]
	at (:3375) ~[mysql-connector-java-5.1.:5.1.38]
	... 55 common frames omitted


参考链接:

/pandajava/article/details/41946251

/shiqidide/article/details/7642531

/questions/2983248/com-mysql-jdbc-exceptions-jdbc4-communicationsexception-communications-link-fai



起因和现象:

项目运行后,莫名其妙就在log中看到这个报错,但是数据也能获取到,不影响日常使用,但是看到了总归不爽。


看了下网上的原因:

MySQL服务器默认的“wait_timeout”是28800秒即8小时,意味着如果一个连接的空闲时间超过8个小时,MySQL将自动断开该连接,而连接池却认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错。
出现异常”The last packet sent successfully to the server was 0 milliseconds ago.“的大部分原因


是由于数据库回收了连接,而系统的缓冲池不知道,继续使用被回收的连接所致的。


解决方法:

的URL中加上属性(旧版本可用,不推荐)

按照错误的提示,可以在JDBC URL中使用autoReconnect属性,实际测试时使用了autoReconnect=true&failOverReadOnly=false,不过并未起作用,
使用的是5.1版本,可能真像网上所说的只对4之前的版本有效。


2.修改MYSQL的配置文件/,添加超时等待参数的最长时间(推荐)

没办法,只能修改MySQL的参数了,wait_timeout最大为31536000即1年,在中加入:
[mysqld]
wait_timeout=86400 (8天)
interactive_timeout=7200
重启生效,需要同时修改这两个参数。

3.修改配置,让缓冲池验证链接是否有效

#SQL查询,用来验证从连接池取出的连接
=SELECT 1
#指明连接是否被空闲连接回收器(如果有)进行检验,如果检测失败,则连接将被从池中去除
=true
#在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位,一般比minEvictableIdleTimeMillis小
=300000
#在每次空闲连接回收器线程(如果有)运行时检查的连接数量,最好和maxActive一致
=50
#连接池中连接,在时间段内一直空闲,被逐出连接池的时间(1000*60*60),以毫秒为单位
=3600000