2011-08-19 73 views
3

回首我的代码,我发现我occasionaly采写:这个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吗?

回答

1

Statement将在垃圾回收时自动关闭,但如果您想在完成垃圾回收后立即释放资源,则需要明确关闭它。

但是请注意,反过来确实有效。也就是说,关闭Statement也会关闭与其关联的ResultSet

+0

你确定所有'Statement's在垃圾收集时都关闭吗? Javadoc没有指定关于该类的'finalize()'方法的任何行为。 –

1

如果语句包含结果集,gc不收集它。您可以使用第二种方法或使用方面或过滤器来自动关闭它们。

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(); 
    } 
} 
+0

+1。虽然不完美,但这比不使用任何'finally'块更好。 –

+0

哦,是的,有更好的模式可供使用。但是这得到了重点。 – Marvo

+0

@Marvo,如果你有更好的图案,请随时添加它们作为答案! – EricR