2017-02-17 79 views
0

我使用JAVA JDBC驅動程序從MySQL中獲取數據。連接到MySQL時通信鏈接失敗

以下異常發生:

「通信鏈路故障的最後一個數據包成功接收 從服務器爲14380298毫秒前的最後一個數據包發送 成功服務器是14380634毫秒以前。」。

此錯誤正在發生。這意味着如果我第一次運行這個沒有發生異常,但第二次發生這種異常。然後在第三輪中,沒有例外,第四場比賽再次出現異常。我使用TimerTask運行程序每四個小時

程序和數據庫之間的通信在沒有例外的情況下正常運行。

代碼如下:

public class CreatePO extends TimerTask { 

    public CreatePO() { 
     handler = new RFCHandler(); 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     try { 
      System.out.println("Run Create PO"); 
      getItemFromDB(); 
      sendDataToSap(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private void getItemFromDB() { 
     // TODO Auto-generated method stub 
     System.out.println("Run get items from DB"); 
     Connection connection = null; 

     DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     Date date = new Date(); 
     System.out.println(dateFormat.format(date)); 

     String queryOne = "SELECT reference_no, vendor_acc_no, date, mat_no," 
       + "po_qty, po_unit_measure, rate, order_price_unit, plant, user_name, email_id " 
       + "FROM tbl_po_data WHERE status <> 'X'"; 

     try { 
      pooler = DBPool_POSMS.getInstance(); 
      dataSource1 = pooler.getDataSource(); 
      System.out.println("PO pooler"); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      System.out.println(" : PO pooler error"); 
     } 

     try { 
      connection = dataSource1.getConnection(); 
      connection.setAutoCommit(false); 

      Statement st = connection.createStatement(); 
      ResultSet rs = st.executeQuery(queryOne); 

      int lineitem = 0; 

      rs.last(); 
      rcount = rs.getRow(); 
      rs.beforeFirst(); 
      System.out.println("rcount = " + rcount); 

      System.out.println("PO while loop"); 
      itemData = new Object[11][rcount]; 

      if (rcount > 0) { 

       while (rs.next()) { 
        itemData[0][lineitem] = rs.getString("reference_no"); 
        itemData[1][lineitem] = rs.getString("vendor_acc_no"); 
        itemData[2][lineitem] = rs.getDate("date"); 
        itemData[3][lineitem] = rs.getString("mat_no"); 
        itemData[4][lineitem] = rs.getString("po_qty"); 
        itemData[5][lineitem] = rs.getString("po_unit_measure"); 
        itemData[6][lineitem] = rs.getString("rate"); 
        itemData[7][lineitem] = rs.getString("order_price_unit"); 
        itemData[8][lineitem] = rs.getString("plant"); 
        itemData[9][lineitem] = rs.getString("user_name"); 
        itemData[10][lineitem] = rs.getString("email_id"); 
        lineitem = lineitem + 1; 
       } 

       rs.close(); 
       st.close(); 

      } 

     } catch (SQLException e1) { 
      // TODO Auto-generated catch block 
      System.out.println(" : PO while loop error"); 
      e1.printStackTrace(); 

     } finally { 
      try { 

       connection.close(); 
       System.out.println("Close connection one"); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       System.out.println(" : Connection close error"); 
      } 
     } 

    } 

    private void sendDataToSap() { 

     System.out.println("Send Data to Sap"); 
     Table IT_LIST = null; 
     Table IT_RESPONSE = null; 

     try { 

      if (rcount > 0) { 



       } 

      } 

     } catch (Exception e) { 
      // TODO: handle exception 
      handler.releaseClient(); 
      System.out.println(e + " : Handler release error"); 
     } 

     finally { 
      rcount = 0; 
     } 

    } 

例外...

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

The last packet successfully received from the server was 14,380,298 milliseconds ago. The last packet sent successfully to the server was 14,380,634 milliseconds ago. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989) 
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3743) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2506) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2677) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545) 
    at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4842) 
    at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:371) 
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:328) 
    at CreatePO.getItemFromDB(CreatePO.java:84) 
    at CreatePO.run(CreatePO.java:53) 
    at java.util.TimerThread.mainLoop(Timer.java:555) 
    at java.util.TimerThread.run(Timer.java:505) 
Caused by: java.net.SocketException: Connection reset by peer: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153) 
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) 
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) 
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3725) 
    ... 10 more 
+0

爲什麼不依賴'rs.next()'而不是使用'rcount'? –

回答

0

的問題是,你的連接打開時間過長,是由MySQL服務器(關閉由指示「連接由對等體重置:套接字寫入錯誤「堆棧跟蹤中的)。您需要配置您的連接池,以關閉過時的連接,在交付之前驗證(測試)連接或將其組合在一起。

您也可以嘗試增加MySQL中的超時配置,但說實話,只需要關閉一個打開時間接近4小時(1400萬毫秒)的連接即可。

+0

但我在finally塊中關閉了我的連接。 –

+0

@ D.Madu如果使用連接池,則關閉連接會將其返回到池以供重用。例外情況下的1400萬毫秒錶明連接已經打開(和未使用)接近4小時。 –