2012-07-05 33 views
1

我們有一個java應用程序,我們使用了多於一個語句變量。問題爲什麼需要多一個語句,就是在循環內運行一個結果的時候,我們需要完成一些其他的查詢操作。大多數地方使用單個地方很多次,最後我們關閉。我們現在要確認的是,我們沒有關閉結果集變量,並且我們注意到內存的使用會波動。因此,在stmt獲得結果或結束之前立即關閉結果集的最佳機制是什麼關閉?關閉聲明是否足夠好,還是我們也必須關閉每個結果集?

+0

在我上一份工作中,我們發現ResultSet沒有達到查詢的末尾(就像如果你不在循環while(rs.next()))並且你沒有關閉它,它可能會泄漏資源,至少與甲骨文。如果將它運行到查詢結尾,它似乎不會泄漏。 – 2012-07-05 18:10:14

+0

我建議您儘快關閉ResultSet,與Statement相同,與連接相同 – ControlAltDel 2012-07-05 18:11:40

+0

我推薦'resultSet.getStatement()。close();'它關閉語句和ResultSet。 – jn1kk 2012-07-05 18:14:34

回答

3

根據JDBC說明書和Statement.close() API doc它應足以:

注意:當Statement對象被關閉時,它的當前ResultSet對象,如果存在的話,也被關閉。

基於此,你應該能夠假設你只需要關閉一個語句。然而,由於語句的使用壽命可能比使用從中獲取的單個ResultSet的壽命更長,因此通常儘快關閉ResultSet是個不錯的主意。

由於例如您再次使用它來執行另一個查詢,或者在PreparedStatement使用不同參數再次執行查詢時,語句可能會有更長的生命週期。在執行另一個查詢的情況下,先前獲得的ResultSet將被關閉。

+0

這是繼續重複使用語句或每次使用新語句時的正確方法。我認爲重新使用它是一種實際的方法,可以正確地移動並保持安全,只需關閉結果集即可。 – user837306 2012-07-05 18:30:38

+0

一般而言,您應該將'PreparedStatement'與參數化查詢一起使用,因爲這樣可以保護您免受SQL注入的影響,因爲只能爲相同查詢(使用不同參數)重複使用Statement。除此之外,重用陳述或創建新陳述並沒有真正的反對或反對。 – 2012-07-05 18:32:56

+0

由於我們現在有很多疑問,因此我認爲我們需要一些時間才能進入準備狀態。所以如果我們移動到準備狀態,那麼對於每個查詢我們都必須使用新的Statement? – user837306 2012-07-05 18:58:20

1

完成後關閉它,與其他任何資源一樣。莫指出要堅持更長時間,特別是如果你想測量記憶,這意味着記憶問題。

+0

我們不關閉stmt變量,因爲我們不斷地重複使用整個程序,並且只在最後的語句中關閉它才行。所以我們會在完成閱讀後立即關閉結果集,而不是在最後的聲明中表示沒問題? – user837306 2012-07-05 18:27:07

+0

@ user837306'什麼時候完成'的部分不清楚? – EJP 2012-07-08 06:45:11

+0

當你說完每個查詢的結束含義時,我不清楚你是在建議一個新的陳述嗎? – user837306 2012-07-10 05:20:09

相關問題