Java 7 自动资源管理 JDBC(try-with-resources 语句)

标签 java jdbc java-7 try-with-resources

如何将创建/接收连接、查询数据库和可能处理结果的常见 JDBC 习惯用法与 Java 7 的自动资源管理、try-with-resources 语句集成? (Tutorial)

在 Java 7 之前,通常的模式是这样的:

Connection con = null;
PreparedStatement prep = null;

try{
    con = getConnection();
    prep = prep.prepareStatement("Update ...");
    ...
    con.commit();
}
catch (SQLException e){
    con.rollback(); 
    throw e;
}
finally{
    if (prep != null)
        prep.close();
    if (con != null)
        con.close();
}

使用 Java 7,您可以:

try(Connection con = getConnection(); PreparedStatement prep = con.prepareConnection("Update ..."){

   ...
   con.commit();
}

这将关闭 ConnectionPreparedStatement,但是回滚呢?我无法添加包含回滚的 catch 子句,因为该连接仅在 try block 内可用。

您仍然在 try block 之外定义连接吗?这里的最佳做法是什么,尤其是在使用连接池的情况下?

最佳答案

try(Connection con = getConnection()) {
   try (PreparedStatement prep = con.prepareConnection("Update ...")) {
       //prep.doSomething();
       //...
       //etc
       con.commit();
   } catch (SQLException e) {
       //any other actions necessary on failure
       con.rollback();
       //consider a re-throw, throwing a wrapping exception, etc
   }
}

根据oracle documentation ,您可以将 try-with-resources block 与常规 try block 结合使用。 IMO,上面的例子捕捉到了正确的逻辑,就是:

  • 如果没有任何问题,尝试关闭 PreparedStatement
  • 如果内部 block 出现问题,(无论是什么)回滚当前事务
  • 无论如何都尝试关闭连接
  • 如果关闭连接出现问题,则无法回滚事务(因为这是连接上的一种方法,现在处于不确定状态),所以不要尝试

在 java 6 和更早版本中,我会使用一组三重嵌套的 try block (外部 try-finally、中间 try-catch、内部 try-finally)来执行此操作。 ARM 语法确实使这个更简洁。

关于Java 7 自动资源管理 JDBC(try-with-resources 语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9260159/

相关文章:

java - 通过 oracle 直接连接到 db2 数据库时它可以连接,但是通过 java 代码连接时会抛出异常

generics - 用于处理泛型参数的 JDK 接口(interface)

java - @CrossOrigin 注释无法编译

java - Tomcat6 和 Java 7

java - 通过java swing向数据库插入数据

Java JDBC swing登录表单错误

java - Apache Commons ToStringBuilder 字符串编码

java - 调试使用 Spock 和 JMockit 测试的 Java 代码

java - 修改toString循环数组缓冲区

java - 使用具有不同根和节点类型的 TreeTable