【问题标题】:JDBC: Catch "SQLException: I/O Error: Connection reset caused" by "SocketException: Connection reset"JDBC:捕获由“SocketException:连接重置”引起的“SQLException:I/O错误:连接重置”
【发布时间】:2016-04-01 10:02:41
【问题描述】:

我的代码建立 JDBC 连接并重复查询 Microsoft SQL SMS。但是,有时我会收到错误:

“线程“main”java.sql.SQLException 中的异常:I/O 错误:连接重置” 后跟 “原因: java.net.SocketException:连接重置”

我的代码如下所示:

public static void main(String[] args){
    ...
    // Establish JDBC connection
    Class.forName(DRIVER);
    Connection conn = DriverManager.getConnection(URL, USER, PASS);
    Statement stmt = conn.createStatement(); 
    ...
    // Perform SQL query
    for(int i=0; i<size; i++)
        functionA(stmt); // <--line 62
    ...
}

public static void functionA(Statement stmt){
    String aql = "INSERT INTO...";
    stmt.executeUpdate(sql); // <-- line 105
}

我查询数据库是为了测试一些与数据无关的功能。因此,我希望我的程序在抛出异常时自动重新建立连接,这样我就可以让它自行运行。

我的问题是: 1)我可以在try...catch中重新建立JDBC连接吗? 2)如果是这样,要捕获哪个异常以及在哪里捕获它? 3) 我应该在 catch 中放置什么?

【问题讨论】:

  • 程序的哪一部分“重复查询”数据库?
  • 这是一个围绕functionA的for循环。
  • 请将异常堆栈跟踪作为文本而不是屏幕截图。

标签: java sql jdbc


【解决方案1】:

如果您想捕获问题中列出的异常,则需要捕获 SQLException,例如:

  // Perform SQL query
    for(int i=0; i<size; i++) {
        try {
        functionA(stmt); // <--line 62
        } catch(SQLException e) {
          System.out.println(e.getMessage());
          //You can add here your recovery logic ...
        }
    }

是的,您可以尝试在异常后重新建立连接,在 catch 块中放置一种重新连接机制...

如果您想检查导致 SQLException 的内部异常,您可以使用 getCause() 进行检查:

        } catch(SQLException e) {
          if(e.getCause() instanceof SocketException) {
          //You can add here your recovery logic ...
          }
        }

【讨论】:

  • 根据报错信息,SocketException难道不是SQLException的“原因”吗?你知道我可以重新建立连接吗?
  • 是的,您甚至可以根据需要检查内部异常...这取决于您需要做什么...
  • 我希望我的程序不要停止并重新建立连接。任何解决方法都可以解决我的问题。
  • 你可以在catch块里面放一个恢复逻辑,如果恢复成功,那么你就可以继续...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2013-09-28
  • 2020-02-18
  • 1970-01-01
相关资源
最近更新 更多