在 Java 中重试 JDBC 连接

Posted

技术标签:

【中文标题】在 Java 中重试 JDBC 连接【英文标题】:Retry JDBC connection in Java 【发布时间】:2019-03-22 00:49:34 【问题描述】:

我正在尝试使用重试逻辑来获取 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)

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

或者如果有其他方法可以实现重试部分?

【问题讨论】:

只有将conn 显式设置为null 才能使其变为null。关闭连接不会使变量为空,它只是关闭连接。 请注意,我们更喜欢这里的技术写作风格。我们轻轻地劝阻问候,希望你能帮助,谢谢,提前感谢,感谢信,问候,亲切的问候,签名,请你能帮助,聊天材料和缩写 txtspk,恳求,你多久了被卡住、投票建议、元评论等。只需解释您的问题,并展示您尝试过的内容、预期的内容以及实际发生的情况。 【参考方案1】:

这是针对您的问题的测试方法。此方法尝试连接 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 数据库 连接成功!用户 ID = 9 连接已关闭...

【讨论】:

【参考方案2】:

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

【讨论】:

是的。除此之外,没有实际测试,这看起来不错。正确的 ?与空运行和所有。我的意思是寻求第二意见。

以上是关于在 Java 中重试 JDBC 连接的主要内容,如果未能解决你的问题,请参考以下文章

在 vuejs 中重试失败的 ajax 请求

Netty 连接重试

如何在 graphql_flutter 中重试对 GraphQLError 的请求

在循环中重试死锁,它们最终会解决吗?

Ansible - 在循环中重试失败的迭代

Spring Cloud - 在 RestTemplate 中重试工作?