Java8 Try-with-resource / JDBC / Play Framework:这是正确的吗?

时间:2015-03-05 13:50:44

标签: java jdbc playframework try-with-resources

我已经使用try-with-resources重写了Play2 / JDBC查询,但我不确定,如果这是正确的。 第一个try块处理Connection和PrepareStatement。第二个尝试处理ResultSet。

理论上,连接,语句和结果集在任何情况下都会正确关闭?是对的吗?或者我是否会遗漏需要处理的事情?

public static List<Item> findBySimpleSQL(String where, java.lang.Object... params) {
  List<Item> collection = new ArrayList<Item>();
  try (Connection connection = play.db.DB.getConnection();
       PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM items WHERE "+where);)
  {
    int pos = 1;
    for (java.lang.Object o : params) {
      if (o instanceof Integer) {pstmt.setInt(pos, (int) o);}
      if (o instanceof Long) {pstmt.setLong(pos, (long) o);}
      if (o instanceof String) {pstmt.setString(pos, (String) o);}
      pos++;
    }
    try (ResultSet rs = pstmt.executeQuery()) {
      while (rs.next()) collection.add(parse(rs));
    }
  } catch (Exception e) {
    Logger.error("Error message: "+e);
  }
  return collection;
}

- 添加了对catch块的记录。

1 个答案:

答案 0 :(得分:0)

来自Oracle的The try-with-resources Statement

  

&#34;资源是在程序出现后必须关闭的对象   完成它。 try-with-resources语句确保每个   资源在语句结束时关闭。任何对象   实现java.lang.AutoCloseable,其中包含所有对象   实现java.io.Closeable,可以用作资源。&#34;

在您的情况下,ConnectionPreparedStatementResultSet都会实现AutoCloseable界面,所以答案是:

是的,它们将被正确关闭(不确定任何情况,编码和绝对不能很好地相处)。

您可能希望阅读上述链接,并确保正确捕获可能的例外情况。