在Java中重试JDBC连接

时间:2018-10-17 10:54:15

标签: java jdbc

我正在尝试使用重试逻辑来获取JDBC连接,以防出现类似以下内容的SQL异常:

    int counter = 0;
Connection conn = null;
    while (null == conn) {
      try {
        conn = GetConnectionObject;

      } catch (SQLException e) {
        if (++counter > MAX_RETRY) {
          //Log ERROR
          break;
        }
      } finally {
        if (null != conn) {
          try {
            DbUtils.close(conn);
          } catch (SQLException e) {
            logger.error("Exception while closing the connection object");
          }
        }
      }
    }

我目前无法对此进行测试,因此需要一些帮助。

如果我遇到异常,则可以正常工作,然后重试后可以登录。但是,如果我们没有得到异常,它将到达finally块并关闭连接。 Try-Catch-Finally最后在while循环中。

因此,如果我关闭连接,则流量达到

  

while(null == conn)

我的连接对象在关闭后会变成null吗?

或者是否还有其他方法可以实现重试部分?

2 个答案:

答案 0 :(得分:0)

否,关闭后它将不会为空。使用Connection.isClosed()代替while( null== conn)。另外,您应该从此代码中获取//Do some task.,因为它的目标是获得JDBC连接。

答案 1 :(得分:0)

这是针对您的问题的经过测试的方法。此方法尝试3次连接,当它获得数据库连接时,它将打印成功消息,并运行查询并显示结果,否则将打印错误消息。同样,如果连接成功,则它将在finally块中执行查询后关闭连接。

public void retryDBConnection(){
int counter = 0;
        Connection con = null;
        while(counter < 3 && con == null){
        try{
            String str = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
            Class.forName(str).newInstance();
            con = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;Database=TestDB;", "sa", "sqldb");
            System.out.println("DB Connection Successful!");
            PreparedStatement prep = con.prepareStatement("select ID, User_Name from tblUser where ID = 9");
            ResultSet rs = prep.executeQuery();
            if(rs.next()){
                System.out.println("User ID = " + rs.getString(1));
                //name = rs.getString(2);
            }
        }
        catch(SQLException e){
//          System.out.println(e.getSQLState());
            if(e.getErrorCode() == 0 || e.getErrorCode() == 4060)
            counter++;
            System.out.println("Attempt: " + counter +", Could not establish DB Connection!");
            System.out.println("Error Code: " + e.getErrorCode());

        }
    catch(Exception e){
        e.printStackTrace();
    }finally{
        if(con != null){
            try {
                con.close();
                System.out.println("Connection closed...");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    }

}
  

这是该方法的输出。

     
    

尝试:1,无法建立数据库连接!错误代码:0尝试:2,无法建立数据库连接!错误代码:4060 DB     连接成功!用户ID = 9连接已关闭...