如何修复此 java mysql 异常:通信链路故障?

Yu *_* Gu 6 mysql jdbc

这是此异常的日志:

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

The last packet successfully received from the server was 1,409,240 milliseconds ago.  The last packet sent successfully to the server was 1,409,267 milliseconds ago.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
        at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:2229)
        at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1989)
        at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:3410)
        at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:470)
        at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3112)
        at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2341)
        ...
Caused by: java.io.EOFException: Can not read response from server. Expected to read 7 bytes, read 5 bytes before connection was unexpectedly lost.
        at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3011)
        at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:2212)
Run Code Online (Sandbox Code Playgroud)

我知道这个异常很正常,我用谷歌搜索了一下并得到了很多解决方案。然而,这些解决方案都没有解决我的问题。
嗯,这只是一个简单的java应用程序,而不是java web应用程序,而且我没有使用任何连接池,只是使用了JDBC。我的mysql版本是5.7.12。mysql运行在windows服务器上,而java应用程序运行在linux上。我检查了mysql的“wait_timeout”,它是28800,比1409240毫秒大得多。所以问题应该不是由这个问题引起的。我还检查了我的linux上的tcp连接等待时间,它是7200秒,仍然比1409240毫秒大得多。我还尝试将 '?autoReconnect=true' 添加到 JDBC url,但仍然没有任何区别。而且我确信我的服务器的可访问性没有任何问题,因为在问题发生之前连接确实可以工作几分钟。
我几乎已经尝试了所有我能做的事情。然而,问题仍然存在。我应该怎么办?有没有可能是windows防火墙的问题?

编辑:当执行 SELECT 查询尝试从大小为 10.9 G 的表中选择所有数据项时,会出现此问题。也许这个表太大了,以至于句子ResultSet rs = stmt.executeQuery(sql); 无法完成。但是我检查了mysql的'max_execution_time'变量,它设置为0,表明没有执行时间限制。

O. *_*nes 6

欢迎使用 TCP/IP。很多事情都可能导致 TCP 连接丢失,尤其是闲置了一段时间的连接。正如您提到的,这样的东西就是防火墙。即使客户端和服务器都同意连接应保持活动状态,连接也可能会被某些网络实体中断。当客户端和服务器不在同一本地网络时,连接丢失的可能性会增加。

找出原因意味着在网络中的不同位置进行大量数据包监控。这会花费大量的时间和精力,但并不能教会你太多。另外,学习读取wireshark 输出是一项真正的任务。

大多数需要持久连接的客户端-服务器程序员都会使用某种保活操作来避免连接闲置时间过长。Keepalive 操作会发送一些内容并获取一些内容。SELECT NOW()在您的情况下,您可以通过在客户端闲置时每隔一两分钟发出一次查询(或其他一些往返无操作)来完成此操作。

处理这种事情的最好方法是在需要时打开数据库连接,然后在完成后关闭它。如果您使用连接池功能,您可以在每次查询时打开和关闭池连接,并且仍然避免搅动物理连接。JDBC 连接器和 MySQL 服务器代码针对此方法进行了优化;这可能是最好的方法。