快捷搜索: 王者荣耀 脱发

关于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解决办法: [已解决]踩过的坑之mysql连接报“Communications link failure”错误:

经验分享 程序员 微信小程序 职场和发展