回顾我的代码,我发现我偶尔写过:
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()返回一个语句对象,但是当它被实例化时,我没有看到任何简单的方法在我完成后关闭它。我应该只重写代码的各个部分来使用方法#2?
答案 0 :(得分: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 :(得分:1)
Statement
会在垃圾回收时自动关闭,但如果您想在完成资源后立即释放资源,则需要明确关闭它。
但请注意,反向实际上确实有效。也就是说,关闭Statement
也会关闭与其关联的ResultSet
。
答案 2 :(得分:1)
如果语句包含结果集,则gc不会收集它。您可以使用第二种方法或使用方面或过滤器自动关闭它们。