数据库连接断开 Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure...

报错信息如下:

Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 97,130 milliseconds ago. The last packet sent successfully to the server was 24 milliseconds ago.
; SQL []; Communications link failure
....
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

产生问题的直接原因:

  1. 数据库重启
  2. 数据库空闲连接超过设置的最大timemout时间

导致数据库会强行断开已有的链接,就会报这个异常。

产生问题的根本原因:

以mysql5版本为例,其自身连接的等待时间(wait_timeout)缺省为8小时,如果在wait_timeout秒期间内,数据库连接(java.sql.Connection)一直处于等待状态,mysql5就将该连接关闭。这时,你的Java应用的连接池仍然合法地持有该连接的引用。当用该连接来进行数据库操作时,就会产生上述错误。

问题解决:

一、马上止损的方法:

重启服务器。(重启服务器,数据库连接池就会重新初始化, 重新获取和数据库的有效连接)

二、避免产生上述问题的方法:【你需要自己按自己采用的连接池,类型去搜索相应的配置,不同连接池可能不同】

1、数据库连接池增加探活配置。(在连接池配置文件中增加下面的关键属性) (推荐这种方式)

为了解决这个异常,我们在配置数据库连接池的时候需要做一些检查连接有效性的配置,这里以Druid为例,相关配置如下(更多配置):这里还有一个(dbcp的配置

字段名默认值说明
validationQuery 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
validationQueryTimeout 单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法
testOnBorrowtrue申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturnfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testWhileIdlefalse建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
timeBetweenEvictionRunsMillis1分钟(1.0.14)有两个含义:1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明

为了避免空闲时间过长超过最大空闲时间而被断开,我们设置三个配置:

validationQuery: SELECT 1
testWhileIdle: true
timeBetweenEvictionRunsMillis: 28000

其中timeBetweenEvictionRunsMillis需要小于mysql的wait_timeout

实例:

        9e90e2be24f2c9e2d163e0b2bf77dbb5f6a.jpg

 

2、增大数据库默认的超时等待时间(wait_timeout) 【如果太大,可能导致连接数较多,引起性能下降】

修改MySQL的参数,wait_timeout最大为31536000即1年,在my.cnf中加入:
[mysqld]
wait_timeout=31536000
interactive_timeout=31536000
重启生效,需要同时修改这两个参数。

 

3、JDBC配置Mysql连接URL重连机制

jdbc:mysql://localhost:3306/test?user=root&password=&autoReconnect=true

 

4、JDBC减少连接池内连接生存周期:使之小于所设置的wait_timeout 的值

<property name="maxIdleTime" value="1800" />   

 

转载于:https://my.oschina.net/zjllovecode/blog/3066742

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure是MySQL数据库连接失败的异常。这个异常通常是由于网络连接问题或MySQL服务器关闭导致的。以下是一些可能的解决方法: 1.检查网络连接是否正常,确保MySQL服务器正在运行并且可以通过网络访问。 2.检查MySQL服务器的日志文件,查看是否有任何错误或警告信息。 3.尝试增加连接超时时间,可以在连接字符串中添加参数来设置连接超时时间,例如:jdbc:mysql://localhost/test?connectTimeout=3000 4.尝试使用连接池来管理数据库连接,这可以减少连接失败的可能性。 5.如果以上方法都无法解决问题,可以尝试升级MySQL驱动程序或者MySQL服务器版本。 以下是一个使用连接池来管理数据库连接的例子: ```java import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; public class DBUtil { private static DataSource dataSource; static { MysqlDataSource mysqlDataSource = new MysqlDataSource(); mysqlDataSource.setURL("jdbc:mysql://localhost/test"); mysqlDataSource.setUser("root"); mysqlDataSource.setPassword("password"); dataSource = mysqlDataSource; } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } } // 使用连接池获取数据库连接 try (Connection conn = DBUtil.getConnection()) { // 执行数据库操作 } catch (SQLException e) { // 处理异常 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值