2012-10-24 13 views
5

Użyłem java do odpytania niektórych rekordów z Mysql. Ale w niektórych querach jednego czasu napotykam problem, który powoduje, że zapytanie nie powiodło się, ale w innych zapytanie jest pomyślne. Komunikat o błędzie jest następny:CommunicationsException: Błąd łącza komunikacyjnego

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 

Próbowałem niektóre metody, takie jak:

  • ustawić max_allowed_packet = 128 * 1024 * 1024 w /etc/my.conf
  • dodać ?autoReconnect=true&failOverReadOnly=false&maxReconnects=10 do mojego url połączenie

ale nic się nie dzieje .

Moje środowisko jest:

  • Mysql: 5.5.3-m3-log dystrybucji źródłowej
  • Java: 1.6.0_16
  • JDK: HotSpot (TM) 64-bitowy serwer VM (build 14.2 -B01, tryb mieszany)
  • JDBC: mysql-connector-java-5.1.18
+0

W operacji użyłem 'group_concat', a mój ciąg konkatycyjny jest bardzo długi. I również wypróbować zapytanie za pomocą php, działa dobrze. Kiedy ustawiam 'group_concat_max_len' <32M, spowoduje to wycięcie niektórych danych przez cięcie przez GROUP_CONCAT() i powrót do sukcesu. Ale jeśli group_concat_max_len> 32M, nie powiodło się. – zhouzuan2k

+0

możliwy duplikat [MySQL-JDBC: Błąd łącza komunikacyjnego] (http://stackoverflow.com/questions/2121829/mysql-jdbc-communications-link-failure) – CloudyMarble

Odpowiedz

6

Problem został rozwiązany. Jest tak, ponieważ wynik jest zbyt duży. W moim zapytaniu użyłem domyślnego kursora, który jest kursorem po stronie klienta, Oznacza to, że cały wynikowy zestaw rekordów SELECT jest zwracany do klienta (aplikacji), a stronicowanie jest tam wykonywane. Zatem całkowity zestaw wyników jest zbyt duży i powoduje, że klient jdbc jest poza pamięcią. Rozwiązaniem jest, że:

  1. add "useCursorFetch = true" do parametrów konfiguracyjnych URL JDBC
  2. wezwanie statement.setFetchSize (100)

Można przeczytać więcej szczegółów z: http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Client%20and%20server%20cursors%20-%20using%20MySQL

0

To może zdarzyć się podczas próby połączenia z czerstwego popełnić. Spróbuj sprawdzić stan połączenia przed wykonaniem zatwierdzenia.

+0

Gdy połączenie jest prawidłowe, operacja również się nie udała. Rzeczywiście, chociaż wykonuję tę operację zaraz po otwarciu połączenia, również się to nie udaje. – zhouzuan2k

Powiązane problemy