2012-03-13 261 views
10

我寫了一個Java程序響應和程序連接到數據庫我的服務器上,查找記錄,寫入記錄,更新和刪除。由於某種原因,查找記錄的作品,但大部分的時候,我嘗試保存或寫它給出了一個錯誤消息的記錄說:無法讀取服務器

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 

任何人都可以解釋爲什麼這是怎麼回事? 通常這會給我錯誤信息,當我嘗試添加一個記錄後,我運行了超過半分鐘的軟件。似乎沒有連接或什麼東西。當我運行該程序,快速編寫一個新的記錄,它的工作原理

+0

我們展示的代碼有意義的部分,這是我們能猜出是唯一的方法發生。 – pcalcao 2012-03-13 15:36:43

+0

您應該仔細管理丟失的連接http://stackoverflow.com/a/8997413/90909 – qrtt1 2012-03-13 15:37:34

+1

我在我的連接器類中有con.close方法。那可能是爲什麼呢? – Pita 2012-03-13 15:42:09

回答

0

是否遵循/閱讀本教程:

Connectivity with MYSQL

你必須爲你的異常的一部分,可以對您有用。

我會引用一些關於你的具體的異常,只是嘗試:

如果你得到的SQLException:連接被拒絕或連接超時 或MySQL的具體CommunicationsException:通信鏈路 失敗,那麼就意味着數據庫根本無法訪問。這可以 有以下原因之一或更多:JDBC URL

IP地址或主機名是錯誤的。 JDBC URL中的主機名是本地DNS服務器無法識別的 。端口號在 JDBC URL中缺失或出錯。數據庫服務器關閉。數據庫服務器不接受TCP/IP 連接。數據庫服務器已經用完了連接。 Java和DB之間的 中的某些內容阻塞連接,例如防火牆或代理。

爲了解決一個或另一個,遵循以下建議:

驗證,並用ping測試。請刷新DNS或使用JDBC URL中的IP地址。根據MySQL.cn的my.cnf驗證它。啓動數據庫。 驗證mysqld是否在沒有--skip-networking選項的情況下啓動。 重新啓動數據庫和修復您的代碼因此,它關閉在最後 連接。禁用防火牆和/或配置 防火牆/代理以允許/轉發端口。

+0

我跟着它,但我根據你的網址做了正確的事。我認爲它的時間會議,這是阻止我做我的分貝。有沒有辦法阻止超時會話?我已經閱讀了關於maxWait的一些不確定的內容,但是無法找到任何關於如何聲明該內容的具體內容,以便系統無論等待多長時間才能等待,直到收到響應。 – Pita 2012-03-13 15:58:16

1

有時候這個問題是由於系統RAM的大小造成的。可能你是通過RAM使用緩衝區插入數據。解決這個問題。

  1. 設置自動提交插入數據前禁用。
  2. 數據插入適當的一定量的系統RAM(不是 整)。
  3. 提交查詢。
  4. 再次執行步驟2和3直到整個插入不會 完成。

您可以通過下面的代碼明白這一點。

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

我有同樣的問題。我提到了很多帖子和評論,但是對我而言,工作是改變my.cnf文件的一些參數。希望這將有助於你也....在my.cnf中的[mysqld]部分

設置以下參數

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

'skip-name-resolve'的值?謝謝 – 2014-12-11 05:52:31