2016-12-26 15 views
1

我有jdbc客戶端(請參閱下面的代碼)定期連接到本地mariadb服務器並查詢複製狀態。在mariadb中顯示狀態查詢錯誤

private void closeResultSet(ResultSet rs) { 
      try { 
       rs.close(); 
      } catch (Exception e) {} 
     } 
     private void closeStatement (Statement st) { 
      try { 
       st.close(); 
      } catch (Exception e) {} 
     } 
     private void closeConnection(Connection c) { 
      try { 
       c.close(); 
      } catch (Exception e) {} 
     } 
     public boolean getStatus() { 
      boolean status = false; 
      Connection conn = null; 
      Statement stmt = null; 
      ResultSet rs = null; 
      try { 
       //Class.forName("com.mysql.jdbc.Driver"); 
       Class.forName("org.mariadb.jdbc.Driver"); 
       // System.out.println("Connecting to database..."); 
       conn = DriverManager.getConnection(DB_URL, USER, PASS); 
       stmt = conn.createStatement(); 
       String sql = "SHOW STATUS LIKE 'wsrep_%'"; 
       rs = stmt.executeQuery(sql); 
       while (rs.next()) { 
        String name = rs.getString(1); 
        String value = rs.getString(2); 
        if (name != null && !name.isEmpty() && value != null && !value.isEmpty()) 
{ 
         System.out.println(value); 

        } 
       } 
       status = true; 
      } catch (SQLException se) { 
       // Handle errors for JDBC 
       se.printStackTrace(); 
      } catch (Exception e) { 
       // Handle errors for Class.forName 
       e.printStackTrace(); 
      } finally { 
       // finally block used to close resources 
       closeResultSet(rs); 
       closeStatement(stmt); 
       closeConnection(conn); 

      } // end try 
      if (!status) 

      return status; 
     } 

    public void run() 
    { 
     while(true) { 
     if (!getStatus()) 
     //failed 
      break; 
     else { 
      sleep 60s 
     } 
    } 
    } 

〜3小時後,我看到

java.sql.SQLNonTransientConnectionException:(CONN:17945)無法讀取結果集:流意外結束,從4

讀0字節

我的代碼有什麼問題嗎?

我想知道「(conn:17945)」是否意味着我有越來越多的連接超越可持續最大...?

+0

嘗試檢查連接是否保持打開狀態。 –

+0

不要使用catch(Exception e){}'「吞下」所有異常,處理它們(例如,至少記錄它們)。 –

回答

0

看起來像MariaDB的問題,解決這個問題的方法似乎很奇怪,因爲你必須保持你的wait_timeout的持續時間相當長,以消除這些問題!

您可能會考慮爲您的數據庫連接設置虛擬驗證查詢。這個查詢可能有幫助!

validationQuery="SELECT 1" 

除了上述情況,您可能必須設置一個相當有效的值,比如說8小時或類似的值。

set wait_timeout=57600 

This鏈接提供的類似線路的一些信息,供您參考,並在相關的討論也this問題。

希望這會有所幫助!