2012-03-13 44 views
10

Tôi đã viết một Chương trình Java và chương trình kết nối với một cơ sở dữ liệu trên máy chủ của tôi, để tìm các bản ghi, ghi các bản ghi, cập nhật và xóa. đối với một số hồ sơ lý do phát hiện hoạt động, nhưng hầu hết thời gian khi tôi cố gắng để tiết kiệm hoặc viết một kỷ lục nó mang lại một thông báo lỗi nói:Không thể đọc phản hồi từ máy chủ

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet successfully received from the server was 9,787 milliseconds ago.  The last packet sent successfully to the server was 8,183 milliseconds ago. 

Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost. 
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2552) 
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3002) 
... 46 more 

bất cứ ai có thể giải thích tại sao điều này đang xảy ra? Thông thường, điều này mang lại cho tôi thông báo lỗi khi cố gắng thêm bản ghi, sau khi tôi đã chạy phần mềm trong hơn nửa phút. dường như mất kết nối hoặc một cái gì đó. khi tôi chạy chương trình và nhanh chóng viết một kỷ lục mới, nó hoạt động

+0

Hiện chúng tôi một phần ý nghĩa của mã này, đó là cách duy nhất chúng ta có thể đoán những gì xảy ra. – pcalcao

+0

Bạn nên quản lý kết nối bị mất cẩn thận http://stackoverflow.com/a/8997413/90909 – qrtt1

+1

tôi có phương thức con.close trong lớp trình kết nối của mình. có lẽ đó là lý do tại sao? – Pita

Trả lời

0

Bạn có làm theo/đọc hướng dẫn này:

Connectivity with MYSQL

Bạn có một phần ngoại lệ của bạn mà có thể hữu ích cho bạn.

Tôi sẽ trích dẫn một cái gì đó về ngoại lệ cụ thể của bạn, chỉ cần thử rằng:

Nếu bạn nhận được một SQLException: Kết nối từ chối hoặc Connection timed out hoặc một CommunicationsException cụ MySQL: Liên kết Truyền thông thất bại, sau đó nó có nghĩa là rằng DB không thể truy cập được. Điều này có thể có một hoặc nhiều nguyên nhân sau:

Địa chỉ IP hoặc tên máy chủ trong URL JDBC sai. Tên máy chủ trong URL JDBC là không được máy chủ DNS cục bộ nhận dạng. Số cổng bị thiếu hoặc sai trong URL JDBC. Máy chủ DB ngừng hoạt động. Máy chủ DB không chấp nhận các kết nối TCP/IP . Máy chủ DB đã hết kết nối. Nội dung nào đó trong số giữa Java và DB là chặn các kết nối, ví dụ: tường lửa hoặc proxy.

Để giải quyết vấn đề này hoặc cách khác, hãy làm theo các lời khuyên sau:

Xác minh và kiểm tra chúng bằng cách ping. Thay vào đó, hãy làm mới DNS hoặc sử dụng địa chỉ IP trong JDBC URL. Xác minh nó dựa trên my.cnf của MySQL DB. Khởi động DB. Xác minh nếu mysqld được khởi động mà không có tùy chọn mạng -skip. Khởi động lại DB và sửa mã của bạn cho phù hợp rằng cuối cùng nó đóng các kết nối . Tắt tường lửa và/hoặc cấu hình tường lửa/proxy để cho phép/chuyển tiếp cổng.

+0

tôi theo sau nó, nhưng tôi đã làm mọi thứ đúng theo url của bạn. Tôi nghĩ rằng đó là thời gian ra phiên, đó là ngăn cản tôi làm những việc để db của tôi. là có cách nào, để ngăn chặn thời gian ra phiên? Tôi đã đọc một cái gì đó về maxWait indefinate, nhưng không thể tìm thấy anythng cụ thể để làm thế nào để tuyên bố rằng, để hệ thống sẽ chờ đợi không có vấn đề phải mất bao lâu cho đến khi nhận được phản ứng. – Pita

1

Đôi khi vấn đề này xảy ra do kích thước RAM hệ thống. Có thể bạn đang chèn dữ liệu bằng bộ đệm thông qua RAM. Để thoát khỏi vấn đề này.

  1. Đặt cam kết tự động vô hiệu hóa trước khi chèn dữ liệu.
  2. chèn một số lượng dữ liệu phù hợp với RAM hệ thống của bạn (không phải là toàn bộ ).
  3. Cam kết truy vấn.
  4. Thực hiện lại các bước 2 và 3 cho đến khi toàn bộ quá trình chèn sẽ không được thực hiện .

Bạn có thể hiểu điều này bằng mã sau.

public static void main(string args[]) 
{ 
    Connection con = null; 
    Statement stm = null; 
    int i; 
    float ratio; 
    ratio=1.0f; 
    try 
    { 
    Class.forName("com.mysql.jdbc.Driver"); 
    // Connecting to the database 
    con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo", 
             "ashish", "impetus"); 
    File f = new File("filler"); // taking the random text data from the file 
           // filler.txt and inserting that string 
           // in filler field of the relations 
    RandomAccessFile r = new RandomAccessFile(f,"r"); 
    Random randomGenerator = new Random(); 
    String strLine=new String(); 
    int r1,flag=0; 
    stm = con.createStatement(); 
    con.setAutoCommit(false) ; 

    int k=0; 
    i=0;     

    long sum2=0; 
    while(k%50000==0) 
    { 
     final long start = currentTimeMillis(); 
     final StringBuilder builder = 
     new StringBuilder("INSERT INTO accounts 
          (aid, bid,abalance,filler) VALUES "); 
     while(i!=naccounts*ratio*scale) 
     { 
     int j=i+1; 
     for(int l=0;l<40;l++) 
     { 
      strLine+=((char)r.read()); 
      r.skipBytes(0); 
     } 
     r1=randomGenerator.nextInt(1500); 
     if(strLine.equals("")) 
     { 
      flag=1; 
     } 
     if(flag!=1) 
     { 
      strLine=strLine.replaceAll("\\s",""); 
      strLine=strLine.replaceAll("\\t",""); 
     }     
     flag=0; 
     if (i%50000!=0) 
     { 
      builder.append(","); 
     } 
     builder.append(format("(%s, %s, %s, '%s')", j, 
         i/naccounts+1, 0, strLine)); 
     strLine=""; 
     r.seek(r1); 
     i++; 
     if(i%50000==0||i>=naccounts*ratio*scale) 
     { 
      final String query = builder.toString(); 
      final PreparedStatement statement1 = con.prepareStatement(query); 
      statement1.execute(); 
      con.commit(); 
      final long stop= currentTimeMillis(); 
      sum2=sum2+(stop-start); 
      statement1.close(); 
     } 
     if(i%50000==0||i>=naccounts*ratio*scale) 
     { 
      break; 
     } 
     } 
     k=k+50000; 
     if(k>naccounts*ratio*scale) 
     { 
     break; 
     } 
    } 
    System.out.println(i+" rows inserted accounts table "); 
    System.out.println("time taken = "+sum2+" milliseconds"); 
    } 
    catch (SQLException e) 
    { 
    System.out.println("Connection Failed! Check output console"); 
    e.printStackTrace(); 
    return; 
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 
} 
4

Tôi đã gặp cùng một loại vấn đề. Tôi đã giới thiệu nhiều bài đăng và nhận xét nhưng điều này có tác dụng đối với tôi đã thay đổi một số tham số của tệp my.cnf. Hy vọng nó sẽ giúp bạn cũng ....

Set thông số sau trong my.cnf [mysqld] phần

interactive_timeout=180 # "No.of sec. a server waits for activity on interactive connection before closing it" 

wait_timeout=180 # "No. of sec. a server waits for an activity on a connection before closing it" 

max_connect_errors=9999 # "More than this number of interrupted connections from a host this host will be blocked from further connections" 

skip-name-resolve # "Don't resolved host names. All host names are IP's" 
+1

giá trị của 'skip-name-resolve'? Cảm ơn –

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