关于jdbc连接mysql出现Communications link failured的问题

问题描述

近日,在测试服务同步功能时,出现了这么一个异常:

2020-09-24 15:45:10,442 com.sitech.esbsync.sap.SapInvoker [pool-1-thread-1] (SapInvoker.java:103) ERROR --> connection init failed
org.hibernate.exception.JDBCConnectionException: could not execute query

//stacktrace略

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.

//stacktrace略

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 6,729,166 milliseconds ago.  The last packet sent successfully to the server was 2 milliseconds ago.
 


出现这个异常的背景是昨日将服务同步功能部署到北京环境(172.18.231.104),然后今早再次调用,就出现上述问题。
值得注意的是,目前北京环境的esb用的是Mysql数据库(172.18.231.40)

另外,昨日也将代码部署到了四川测试环境,今天测试调用,并没出现该问题,四川esb用的是Oracle数据库。

所以,可以定位该异常目前只出现在mysql的数据库连接中。

问题分析

通过上网查询,以及本地咨询Mysql的运维同事,了解到Mysql有维护两个属性:interactive_timeout、wait_timeout


可能的原因就是:MySQL服务在长时间不连接之后断开了,断开之后的首次请求会抛出这个异常

字段解释:来自网上
1)interactive_timeout:
参数含义:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
参数默认值:28800秒(8小时)

(2)wait_timeout:
参数含义:服务器关闭非交互连接之前等待活动的秒数。
在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()


按照网站上的说法,超过timeout未操作,连接则会断开,但是使用的北京mysql库的timeout是86400秒,约24小时。但是昨晚到今早也没超过这么长时间呀。也还是出现这个问题,有点莫名其妙。


然后按照本地运维同事的说法,可能是Mysql服务器端连接池满了。同样通过命令查询thread:

貌似也没什么问题,还是有点不明所以。

一个解决方案

因为是长时连接未进行任何jdbc操作而导致连接失败,所以,考虑在程序中增加一个定时任务。
每隔60秒自动自动执行一次查询操作:select 1 from dual
该方法已更新到北京环境,截止目前发帖,暂未出现该异常。

参考文章:

MySql的Communications link failure解决办法:https://www.cnblogs.com/jpfss/p/11003550.html
[已解决]踩过的坑之mysql连接报“Communications link failure”错误:https://blog.csdn.net/qq_27471405/article/details/80921846

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值