MySQL--解决CommunicationsException: Communications link failure

港控/mmm° 2023-10-01 18:50 150阅读 0赞

原文网址:MySQL—解决CommunicationsException: Communications link failure_IT利刃出鞘的博客-CSDN博客

简介

说明

本文介绍Java中操作MySQL时一个报错的原因及解决方案。这个报错是:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

完整报错信息

  1. 2022-02-16 08:03:00 [WARN] [com.zaxxer.hikari.pool.ProxyConnection:160] - HikariPool-1 - Connection com.mysql.jdbc.JDBC4Connection@1f2bca8b marked as broken because of SQLSTATE(08S01), ErrorCode(0)
  2. Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
  3. The last packet successfully received from the server was 60,061 milliseconds ago. The last packet sent successfully to the server was 60,060 milliseconds ago.
  4. at sun.reflect.GeneratedConstructorAccessor305.newInstance(Unknown Source)
  5. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  6. at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
  7. at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
  8. at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
  9. at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3559)
  10. at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3459)
  11. at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3900)
  12. at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
  13. at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
  14. at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2487)
  15. at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
  16. at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
  17. at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
  18. at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
  19. at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
  20. at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61)
  21. at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java)
  22. at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
  23. ... 74 common frames omitted

原因分析

导致这个报错的原因有两个

  1. 数据库重启
  2. 客户端长时间没操作数据库(数据库空闲连接的时间超过设置的最大timemout时间)

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

对于第二个原因(客户端长时间没操作数据库)

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

查看MySQL的wait_timeout的方法:

  1. mysql > show global variables like 'wait_timeout';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | wait_timeout | 28800 |
  6. +---------------+-------+
  7. 1 row in set (0.00 sec)

解决方案

1. 重启应用(临时方案)

重启应用服务器。

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

2. 客户端连接池配置探活(推荐)

在配置数据库连接池的时候需要做一些检查连接有效性的配置。

上边是文章的部分内容,为便于维护,全文已转移到此网址:MySQL-解决CommunicationsException: Communications link failure - 自学精灵

发表评论

表情:
评论列表 (有 0 条评论,150人围观)

还没有评论,来说两句吧...

相关阅读