CommunicationsException:通信链路故障(CommunicationsExcep

2019-07-02 12:20发布

我用java从MySQL查询一些记录。 但是,在一个持续时间的一些querys,我遇到一个问题,这使得查询失败,但在其他国家,它查询成功。 该错误消息是下一个:

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

The last packet successfully received from the server was 90 milliseconds ago.  The last packet sent successfully to the server was 1,674 milliseconds ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3090)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2979)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3520)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:935)
    at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1433)
    at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2924)
    at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:477)
    at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2619)
    at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1788)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2209)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2569)
    at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1521)
    ......
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.io.IOException: Packets received out of order
    at com.mysql.jdbc.MysqlIO.readRemainingMultiPackets(MysqlIO.java:3152)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3077)
    ... 23 more

我已经尝试了一些方法,比如像:

  • max_allowed_packet = 128 * 1024 * 1024/etc/my.conf
  • 添加?autoReconnect=true&failOverReadOnly=false&maxReconnects=10我的连接网址

但没有任何反应。

我的环境是:

  • MySQL的:5.5.3-M3的日志源分布
  • Java的:1.6.0_16
  • JDK:热点(TM)64位服务器VM(构建14.2-B01,混合模式)
  • JDBC:MySQL的连接器的Java-5.1.18

Answer 1:

问题都解决了。 这是因为结果是过于庞大。 在我的查询中,我使用的默认光标,这是客户端游标,这意味着,一个SELECT的整个得到的记录被返回给客户端(应用)和寻呼在那里完成。 所以,总的结果集是太大了,让JDBC客户端内存不足。 解决方法是:

  1. 加上 “useCursorFetch = true” 将JDBC URL参数配置
  2. 调用statement.setFetchSize(100)

:您可以从阅读更详细http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Client%20and%20server%20cursors%20-%20using%20MySQL



Answer 2:

当您尝试使用陈旧连接犯下可能发生这种情况。 尝试做在提交前检查连接状态。



文章来源: CommunicationsException: Communications link failure