2012-10-24 9 views
5

Ho usato java per interrogare alcuni record da Mysql. Ma in alcune query di una durata, ho incontrato un problema che ha reso la query non riuscita, ma in altri, ha richiesto con successo. Il messaggio di errore è il prossimo:CommunicationsException: Errore del collegamento di comunicazione

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 

ho provato un po 'di metodo, tali come:

  • set max_allowed_packet = 128 * 1024 * 1024 in /etc/my.conf
  • aggiungi ?autoReconnect=true&failOverReadOnly=false&maxReconnects=10 al mio url collegamento

ma non succede nulla .

miei ambienti è:

  • Mysql: 5.5.3-m3-log distribuzione Fonte
  • Java: 1.6.0_16
  • Jdk: HotSpot (TM) a 64 bit di server VM (build 14.2 -b01, modalità mista)
  • JDBC: mysql-connector-java-5.1.18
+0

Nell'operazione, ho usato 'group_concat' e la mia stringa concat è molto lunga. E provo anche la query usando php, funziona bene. Quando ho impostato 'group_concat_max_len' <32M, verrà tagliato alcuni dati per essere stato tagliato da GROUP_CONCAT() e restituito successo. Ma se group_concat_max_len> 32M, non è riuscito. – zhouzuan2k

+0

possibile duplicato di [MySQL-JDBC: Errore collegamento comunicazioni] (http://stackoverflow.com/questions/2121829/mysql-jdbc-communications-link-failure) – CloudyMarble

risposta

6

Il problema è risolto. È perché il risultato è troppo grande. Nella mia query, ho usato il cursore predefinito, che è cursori sul lato client, Ciò significa che l'intero recordset risultante di SELECT viene restituito al client (applicazione) e il paging viene eseguito lì. Quindi il set di risultati totale è troppo grande e rende jdbc client fuori dalla memoria. La soluzione è che:

  1. add "useCursorFetch = true" ai parametri di configurazione URL JDBC
  2. chiamata Statement.setFetchSize (100)

Puoi leggere altro dettaglio da: http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Client%20and%20server%20cursors%20-%20using%20MySQL

0

Questo potrebbe accadere quando si tenta di impegnarsi con il collegamento stantio. Prova a verificare lo stato della connessione prima di eseguire il commit.

+0

Quando la connessione è valida, l'operazione ha esito negativo. Infatti, sebbene eseguo questa operazione subito dopo l'apertura della connessione, anch'essa fallisce. – zhouzuan2k