2012-10-24 17 views
5

私はjavaを使用してMysqlからいくつかのレコードを照会しました。しかし、ある期間のいくつかのクエリーでは、私はクエリーを失敗させる問題に遭遇しますが、他のクエリーではクエリーは成功します。エラーメッセージは次です:CommunicationsException:通信リンクのエラー

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 

私はいくつかの方法を試してみました、のような:

  • は私の接続URL

?autoReconnect=true&failOverReadOnly=false&maxReconnects=10を追加/etc/my.conf

  • max_allowed_packet = 128 * 1024 * 1024を設定しても何も起こりません。

    私の環境では、次のとおりです。

    • のMySQL:5.5.3-M3-ログソースの配布を
    • のJava:1.6.0_16
    • JDK:ホットスポット(TM)64ビットサーバーVM(14.2を構築します-b01、混合モード)
    • JDBCます。mysql-コネクタのjava-5.1.18
  • +0

    1. 追加 "useCursorFetch = true" をJDBC URLの設定パラメータへ
    2. コールstatement.setFetchSize(100)

    は、あなたがより多くの詳細を読むことができます: ソリューションということです操作では、私は 'group_concat'を使用し、私の連結文字列は非常に長いです。また、私はPHPを使用してクエリを試して、それはうまく動作します。 'group_concat_max_len' <32Mを設定すると、GROUP_CONCAT()によっていくつかのデータがカットされ、成功を返します。しかし、group_concat_max_len> 32Mの場合、失敗しました。 – zhouzuan2k

    +0

    [MySQL-JDBC:通信リンク障害]の複製が可能です。(0120-18753-1) – CloudyMarble

    答えて

    6

    問題は解決しました。 結果が大きすぎるためです。私のクエリでは、私は、クライアント側のカーソルであるデフォルトのカーソルを使用します。これは、SELECTの結果として得られるレコードセット全体がクライアント(アプリケーション)に返され、ページングがそこで行われることを意味します。したがって、結果セット全体が大きすぎるため、jdbcクライアントのメモリが不足します。 http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Client%20and%20server%20cursors%20-%20using%20MySQL

    0

    あなたは古い接続にコミットしようとすると、この現象が発生することがあります。コミットを行う前に接続状態をチェックしてみてください。

    +0

    接続が有効な場合、操作も失敗します。実際には、私は接続が開いた直後にこの操作を行いますが、失敗します。 – zhouzuan2k

    関連する問題