2012-10-24 134 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 

我已經嘗試了一些方法,比如像:

  • 設置max_allowed_packet = 128 * 1024 * 1024/etc/my.conf
  • 添加?autoReconnect=true&failOverReadOnly=false&maxReconnects=10我的連接網址

但沒有任何反應。

我的環境是:

  • MySQL的:5.5.3-M3的日誌源分佈
  • 的Java:1.6.0_16
  • 的jdk:熱點(TM)64位服務器VM(建14.2 -b01,混合模式)
  • JDBC:MySQL的連接器,Java的5.1.18
+0

在操作中,我使用了'group_concat',並且我的連接字符串非常長。我也嘗試使用PHP的查詢,它運作良好。當我設置'group_concat_max_len' <32M時,它會通過GROUP_CONCAT()剪切一些數據並返回成功。但是,如果group_concat_max_len> 32M,則失敗。 – zhouzuan2k

+0

可能的[MySQL-JDBC:Communications Link Failure]重複(http://stackoverflow.com/questions/2121829/mysql-jdbc-communications-link-failure) – CloudyMarble

回答

6

問題解決了。 這是因爲結果太大。在我的查詢中,我使用了默認遊標,即客戶端遊標,這意味着,SELECT的整個結果記錄集返回給客戶端(應用程序)並在那裏完成分頁。所以總的結果集太大,導致jdbc客戶端內存不足。 解決方案是:

  1. 添加 「useCursorFetch = true」 將JDBC URL配置參數
  2. 呼叫statement.setFetchSize(100)

可以讀取來自更詳細地:http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Client%20and%20server%20cursors%20-%20using%20MySQL

0

你試圖用無效連接犯下可能發生這種情況。嘗試在提交之前檢查連接狀態。

+0

當連接有效時,操作也會失敗。事實上,儘管我在連接打開後執行此操作,但它也失敗了。 – zhouzuan2k

相關問題