CommunicationsException: сбой канала связи

Я использовал 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

Я пробовал какой-то метод, например:

  • установить max_allowed_packet = 128 * 1024 * 1024 в /etc/my.conf
  • добавить ?autoReconnect=true&failOverReadOnly=false&maxReconnects=10 к моему URL-адресу подключения

но ничего не происходит.

Моя среда:

  • Mysql: 5.5.3-m3-log Распределение исходного кода
  • Java: 1.6.0_16
  • Jdk: 64-разрядная серверная виртуальная машина HotSpot (TM) (сборка 14.2-b01, смешанный режим)
  • JDBC: mysql-коннектор-java-5.1.18

person zhouzuan2k    schedule 24.10.2012    source источник
comment
В операции я использовал group_concat, и моя строка concat очень длинная. И я также пробую запрос с использованием php, он хорошо работает. Когда я устанавливаю group_concat_max_len ‹32M, он вырезает некоторые данные, вырезанные GROUP_CONCAT (), и возвращает успех. Но если group_concat_max_len ›32M, это не удалось.   -  person zhouzuan2k    schedule 25.10.2012
comment
возможный дубликат MySQL-JDBC: отказ канала связи   -  person CloudyMarble    schedule 13.06.2013


Ответы (2)


Проблема решена. Это потому, что результат слишком велик. В моем запросе я использовал курсор по умолчанию, который является курсорами на стороне клиента. Это означает, что весь результирующий набор записей SELECT возвращается клиенту (приложению), и там выполняется разбиение по страницам. Таким образом, общий набор результатов слишком велик, и клиенту jdbc не хватает памяти. Решение таково:

  1. добавить "useCursorFetch = true" в параметры конфигурации URL-адреса JDBC
  2. оператор вызова.setFetchSize (100)

Вы можете прочитать более подробную информацию по адресу: http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Client%20and%20server%20cursors%20-%20using%20MySQL

person zhouzuan2k    schedule 25.10.2012

Это может произойти, если вы попытаетесь зафиксировать устаревшее соединение. Попробуйте проверить состояние подключения перед фиксацией.

person Slowcoder    schedule 24.10.2012
comment
Когда соединение установлено, операция также не выполняется. Действительно, хотя я выполняю эту операцию сразу после открытия соединения, она также не выполняется. - person zhouzuan2k; 25.10.2012