这个jdbc资源已经关闭了吗?

3

回顾我的代码,我发现我偶尔会写出以下代码:

ResultSet rs = conn.createStatement().executeQuery("select * from main");
//snip
rs.close();

有时候我会写下

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("Select * from main");
//snip
rs.close();
st.close();

在第二段代码中,语句关闭更加明显,但是在第一段代码中也关闭了吗?conn.createStatement()返回一个语句对象,但是当它以那种方式实例化时,我看不到任何容易的方法来在完成后关闭它。我应该重新编写各个代码片段以使用第二种方法吗?
3个回答

2
一个好的实践是将 rs.close()st.close() 放在 finally 子句中。
Statement st;
ResultSet rs;

try {
   st = connection.createStatement(...);
   rs = st.executeQuery();
}
catch (JdbcErrorsExceptionsAndFoo exception) {
   // yadda yadda
}
finally {
    if (rs!= null) {
        rs.close();
    }
    if (st != null) {
        st.close();
    }
}

+1. 虽然不完美,但比不使用任何“finally”块要好。 - Adam Paynter
哦,是的,有更好的模式可供使用。但这可以传达重点。 - Marvo
@Marvo,如果你有更好的模式,请随意添加它们作为答案! - EricR

1

Statement会在被垃圾回收时自动关闭,但是如果您想尽快释放资源,则需要显式关闭它。

请注意,反过来实际上确实可以。也就是说,关闭Statement还会关闭与其关联的ResultSet


你确定所有的Statement在垃圾回收时都被关闭了吗?Javadoc没有指定关于该类的finalize()方法的任何行为。 - Adam Paynter

1

如果语句包含结果集,垃圾回收器不会对其进行回收。您可以使用第二种方法或使用方面或过滤器自动关闭它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接