这个jdbc资源是关闭的吗?

时间:2011-08-19 21:57:36

标签: java jdbc

回顾我的代码,我发现我偶尔写过:

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?

3 个答案:

答案 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不会收集它。您可以使用第二种方法或使用方面或过滤器自动关闭它们。