2011-08-19 77 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