当前位置: 首页 > 知识库问答 >
问题:

在Java中重试JDBC连接

乐正晟
2023-03-14

我正在尝试使用重试逻辑来获取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块并关闭连接。最后试着抓住里面的while循环。

所以如果我关闭我的连接,流动如果达到

while(null==连接)

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

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

共有2个答案

宋建本
2023-03-14

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

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,无法建立DB连接!错误代码:0尝试:2,无法建立DB连接!错误代码:4060 DB连接成功!用户ID=9连接已关闭。。。

钱远
2023-03-14

不,它在关闭后不会变为空。使用连接。isClosed()而不是while(null==conn)。此外,您应该得到//执行一些任务 从这段代码中删除,因为它的目标是获得JDBC连接。

 类似资料:
  • 问题内容: 我有一个方法(如下),该方法可以下拉并以String形式返回网页的来源。一切正常且繁琐,但是当连接超时时,程序将引发异常并退出。有没有更好的方法可以执行此操作以允许它在超时时重试,或者有没有办法在此方法内执行此操作? 问题答案: 这是代码的重构,应重试下载时间。虽然尚未进行测试,但是它应该向正确的方向发展。

  • 问题内容: 我们使用JDBC的标准代码部分是… 问题1:使用连接池时,是否应该在最后关闭连接?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。 问题2:以下方法是否接近标准?看起来像是尝试从池中获取连接,并且如果无法建立DataSource,请使用老式的DriverManager

  • 问题内容: 我将SQL Server 2014更新为最新的修订包( 12.0.5207 )。在环境中,唯一启用的协议是TLS1.2(已为此目的设置了注册表项)。我可以使用Management Studio在本地和远程使用SA帐户连接到SQL Server。 但是,当我尝试使用Java代码和JDBC驱动程序 sqljdbc42.jar 建立与SQL Server的连接时,会引发以下异常: 驱动程序无

  • 我正试图通过JSTL连接JDBC。我的Localhost ie:Xampp连接也完成了,但我还是遇到了无法解决的错误。请帮忙!我使用的是Netbeans 8.0.2。下面是代码。[1]: https://i.stack.imgur.com/R4AUp.png[这是我得到的错误][1] 我还添加了“mysql-connector-java-5.1.23-bin”。jar'是Web服务器的lib目录。

  • 问题内容: 我有一个Runnable,它从如下所示的连接池中获得连接,并有60秒的时间对连接进行处理: 当线程在60s之后死掉时,我假定连接已返回到池中,并且当创建新线程时,可以重新使用该连接。但是当我列出我的网络连接时,随着创建更多线程,该列表会不断增长。如上创建的连接是否正确返回到池中,如果可以,我如何强制重新使用连接? 问题答案: 您实际上并没有使用连接池。A 不能直接使用。其目的是作为一个

  • 问题内容: 有人可以提供有关如何建立JDBC连接池的示例或链接吗? 从搜索谷歌,我看到这样做的许多不同方式,这相当令人困惑。 最终,我需要代码来返回一个对象,但是我在入门时遇到了麻烦。欢迎任何建议。 更新: 没有或没有池连接实现?为什么不最好使用这些? 问题答案: 如果你需要一个独立的连接池,那么我首选的是C3P0而不是DBCP(我在上一个答案中已经提到),在重负载下我对DBCP的问题太多了。使用