我已经使用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块的记录。
答案 0 :(得分:0)
来自Oracle的The try-with-resources Statement:
&#34;资源是在程序出现后必须关闭的对象 完成它。 try-with-resources语句确保每个 资源在语句结束时关闭。任何对象 实现java.lang.AutoCloseable,其中包含所有对象 实现java.io.Closeable,可以用作资源。&#34;
在您的情况下,Connection
,PreparedStatement
和ResultSet
都会实现AutoCloseable
界面,所以答案是:
是的,它们将被正确关闭(不确定任何情况,编码和绝对不能很好地相处)。
您可能希望阅读上述链接,并确保正确捕获可能的例外情况。