2016-12-26 49 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问题。

希望这会有所帮助!