Java8使用resource/JDBC/Play框架进行尝试:这是否正确?

Java8使用resource/JDBC/Play框架进行尝试:这是否正确?,java,jdbc,playframework,try-with-resources,Java,Jdbc,Playframework,Try With Resources,我已经使用try with resources重写了一个Play2/JDBC查询,但我不确定这是否正确。 第一个try块处理连接和PrepareStatement。第二次尝试处理结果集 理论上,连接、语句和结果集在任何情况下都将正确关闭?是这样吗?还是我错过了需要处理的事情 public static List<Item> findBySimpleSQL(String where, java.lang.Object... params) { List<Item> co

我已经使用try with resources重写了一个Play2/JDBC查询,但我不确定这是否正确。 第一个try块处理连接和PrepareStatement。第二次尝试处理结果集

理论上,连接、语句和结果集在任何情况下都将正确关闭?是这样吗?还是我错过了需要处理的事情

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块。

来自Oracle的:

资源是程序运行后必须关闭的对象 结束了。try with resources语句确保每个 资源在语句末尾关闭。任何物体 实现java.lang.AutoCloseable,其中包括 实现java.io.Closeable,可以用作资源

在您的例子中,Connection、PreparedStatement和ResultSet都实现了AutoCloseable接口,因此答案是:

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


您可能希望阅读上述链接,并确保正确捕获可能的异常。

有一件事肯定是错误的:永远不要将捕获块保留为空……特别是如果它捕获的只是ExcepionI签出的链接,请尝试使用资源。下面是一个显示JDBC用法的示例。现在我想知道为什么他们不把ResultSet放在一个try with resources块中。有人说你必须关闭结果集,但我发现了这个:。因此,似乎没有必要在ResultSet周围使用try块。有什么评论吗?好吧,还是要看情况而定。假设您希望在处理完ResultSet后重用预编译的PreparedStatement。在这种情况下,ResultSet应该放在它自己的try with resource中。或者PreparedStatement被参数化并在for循环中使用。。。或连接、语句和结果集之间的交互并不像人们想象的那样是线性的。我们还应该考虑JDBC驱动程序的实现,以及conn、stmt和rs是垃圾收集的事实,至少它们是垃圾收集的……您需要额外的澄清吗?或者我们可以关闭这个?