java - 通讯异常 : Communications link failure

标签 java mysql jdbc group-concat sqlexception

我使用java从Mysql中查询一些记录。但是在一些持续时间的查询中,我遇到了一个问题,导致查询失败,但在其他情况下,它查询成功。错误消息如下:

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

我尝试过一些方法,例如:

  • /etc/my.conf中设置max_allowed_pa​​cket = 128 * 1024 * 1024
  • ?autoReconnect=true&failOverReadOnly=false&maxReconnects=10 添加到我的连接网址

但什么也没发生。

我的环境是:

  • Mysql:5.5.3-m3-log 源码分发
  • Java:1.6.0_16
  • Jdk:HotSpot(TM) 64 位服务器虚拟机(版本 14.2-b01,混合模式)
  • JDBC:mysql-connector-java-5.1.18

最佳答案

问题已解决。 就是因为这个结果太大了。在我的查询中,我使用了默认游标,即客户端游标,这意味着 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

关于java - 通讯异常 : Communications link failure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17083825/

相关文章:

mysql - 使用数据库 B 中的字段更新数据库 A 中的字段并避免安全更新警告

java - 如果在 Tomcat 服务器关闭时在线程中使用 JDBC 数据库连接,它们会被释放吗?

java - SQL Server JDBC 的 table.field 表示法?

java - 一个带-Xmx1024m的Java进程怎么会占用3GB常驻内存呢?

php - Laravel 5 whereHas 链接和 orWhere

mysql - 在查询中使用 GROUP_CONCAT 未获得正确的结果

java - 运行时找不到 JDBC 类

java - CMS 垃圾收集器——它什么时候运行?

java - 为什么 System.lineSeparator() 被弃用?

java - Mockito 中的连续通话测试