2012-10-24 33 views
5

Tôi đã sử dụng java để truy vấn một số bản ghi từ Mysql. Nhưng trong một số truy vấn của một thời gian, tôi gặp một vấn đề mà làm cho truy vấn thất bại, nhưng trong những người khác, nó truy vấn thành công. Các thông báo lỗi là tiếp theo:CommunicationsException: Lỗi liên kết truyền thông

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 

Tôi đã thử một số phương pháp, chẳng hạn như:

  • thiết max_allowed_packet = 128 * 1024 * 1024 trong /etc/my.conf
  • thêm ?autoReconnect=true&failOverReadOnly=false&maxReconnects=10 để url kết nối của tôi

nhưng có gì xảy ra .

môi trường của tôi là:

  • Mysql: 5.5.3-m3-log phân phối Nguồn
  • Java: 1.6.0_16
  • JDK: HotSpot (TM) 64-Bit Server VM (xây dựng 14,2 -b01, chế độ hỗn hợp)
  • JDBC: mysql-connector-java-5.1.18
+0

Trong hoạt động, tôi đã sử dụng 'group_concat' và chuỗi concat của tôi rất dài. Và tôi cũng thử truy vấn bằng cách sử dụng php, nó hoạt động tốt. Khi tôi đặt 'group_concat_max_len' <32M, nó sẽ cắt một số dữ liệu bằng cách cắt bởi GROUP_CONCAT() và trả về thành công. Nhưng nếu group_concat_max_len> 32M, nó không thành công. – zhouzuan2k

+0

có thể trùng lặp của [MySQL-JDBC: Lỗi liên kết truyền thông] (http://stackoverflow.com/questions/2121829/mysql-jdbc-communications-link-failure) – CloudyMarble

Trả lời

6

Sự cố được giải quyết. Đó là vì kết quả quá lớn. Trong truy vấn của tôi, tôi đã sử dụng con trỏ mặc định, đó là con trỏ phía máy khách, Điều này có nghĩa là toàn bộ bản ghi kết quả của một SELECT được trả về cho ứng dụng khách (client) và phân trang được thực hiện ở đó. Vì vậy, tổng số kết quả được đặt quá lớn và làm cho máy khách jdbc hết bộ nhớ. Giải pháp là:

  1. add "useCursorFetch = true" để thông số cấu hình URL JDBC
  2. gọi statement.setFetchSize (100)

Bạn có thể đọc thêm chi tiết từ: http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Client%20and%20server%20cursors%20-%20using%20MySQL

0

Điều này có thể xảy ra khi bạn cố gắng để thực hiện với kết nối cũ. Thử kiểm tra trạng thái kết nối trước khi thực hiện cam kết.

+0

Khi kết nối hợp lệ, thao tác cũng không thành công. Thật vậy, mặc dù tôi thực hiện thao tác này ngay sau khi kết nối mở ra, nó cũng không thành công. – zhouzuan2k

Các vấn đề liên quan