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

Java 8 Try-with-resource/JDBC/Play框架:这是正确的吗?

申屠亦
2023-03-14

我已经使用try with资源重写了一个Play2/JDBC查询,但我不确定这是否正确。第一个try块处理Connection和准备语句。第二次尝试处理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;
}

-- 向捕获块添加了日志记录。

共有1个答案

卜方伟
2023-03-14

摘自甲骨文的“尝试资源声明”:

"资源是程序完成后必须关闭的对象。try-with-Resource语句确保每个资源在语句结束时关闭。任何实现java.lang.AutoCloseable的对象,包括实现java.io.Closeable的所有对象,都可以用作资源。"

在您的例子中,ConnectionPresared语句ResultSet都实现了AutoCloseable接口,所以答案是:

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

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

 类似资料:
  • 问题内容: 我正在尝试绘制Play框架如何支持转义。 这是一个很好的页面,阐明了所需的功能:https : //www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet 因此,我尝试将其与Play模板功能相关联,并充分了解Play的功能和不功能。 HTML转义:或函数 属性转义:我找不到内置解决方案

  • 我正在尝试将powermock和mockito与Spring一起使用。我以前用过,但没有Spring。Spring-cloud-stream-test-support已经提供了和一些其他依赖项。Mockito在这个JUnit版本中也运行良好。 但是,我必须模拟一些静态方法调用,所以我需要使用PowerMock。我已经尝试将Powermock包含在JUnit和Mockito的这些版本中。 JUnit

  • **编程对象,Settings.UseJavaCP.Value=true。 Build.Scala

  • 问题内容: 我已经开发了一个Spring / JPA应用程序: 服务,存储库和域层即将完成 。 该 所缺的只是层是网络层 。我正在考虑将Playframework 2.0用于Web层,但不确定是否可以 在Playframework 2.0类中注入/使用spring bean 。 这可能吗?如果可以,怎么办? 问题答案: 您可以。已针对Play 2.5.x更新: https://github.com