2012-10-24 11 views
5

Ich verwendete Java, um einige Datensätze von Mysql abzufragen. Aber in einigen Abfragen einer Dauer, triffe ich ein Problem, das Abfrage fehlgeschlagen, aber in anderen Abfragen erfolgreich. Die Fehlermeldung lautet weiter:CommunicationsException: Kommunikationsverbindungsfehler

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 

ich eine Methode versucht haben, solche wie:

  • gesetzt max_allowed_packet = 128 * 1024 * 1024 in /etc/my.conf
  • ?autoReconnect=true&failOverReadOnly=false&maxReconnects=10 meiner Verbindung url hinzufügen

aber es passiert nichts .

Meine Umgebungen ist:

  • Mysql: 5.5.3-m3-log Verteilung Quelle
  • Java: 1.6.0_16
  • Jdk: HotSpot (TM) 64-Bit Server VM (Build 14.2 -b01, mixed mode)
  • JDBC: mysql-connector-java-5.1.18
+0

In der Operation habe ich 'group_concat' verwendet und meine concat-Zeichenfolge ist sehr lang. Und ich versuche auch die Abfrage mit PHP, es funktioniert gut. Wenn ich 'group_concat_max_len' <32M einstelle, wird es einige Daten schneiden, indem es von GROUP_CONCAT() abgeschnitten wurde und Erfolg zurückgibt. Aber wenn group_concat_max_len> 32M, ist es fehlgeschlagen. – zhouzuan2k

+0

mögliches Duplikat von [MySQL-JDBC: Kommunikationsverbindungsfehler] (http://stackoverflow.com/questions/2121829/mysql-jdbc-communications-link-failure) – CloudyMarble

Antwort

6

Das Problem ist gelöst. Es ist, weil das Ergebnis zu groß ist. In meiner Abfrage habe ich den Standardcursor verwendet, bei dem es sich um clientseitige Cursor handelt. Dies bedeutet, dass das gesamte resultierende Recordset eines SELECT an den Client (Anwendung) zurückgegeben wird und das Paging dort erfolgt. Daher ist das Gesamtresultat zu groß und macht den jdbc-Client nicht mehr zu einem Arbeitsspeicher. Die Lösung besteht darin, dass:

  1. add "useCursorFetch = true" zu JDBC-URL-Konfigurationsparameter
  2. Aufruf Statement.setFetchSize (100)

Sie mehr Detail aus lesen können: http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Client%20and%20server%20cursors%20-%20using%20MySQL

0

Dies kann passieren, wenn Sie versuchen, mit veralteter Verbindung zu begehen. Versuchen Sie, vor dem Commit den Verbindungsstatus zu prüfen.

+0

Wenn die Verbindung gültig ist, schlägt der Vorgang ebenfalls fehl. In der Tat, obwohl ich diese Operation direkt nach dem Öffnen der Verbindung mache, schlägt sie auch fehl. – zhouzuan2k

Verwandte Themen