我們有一個java應用程序,我們使用了多於一個語句變量。問題爲什麼需要多一個語句,就是在循環內運行一個結果的時候,我們需要完成一些其他的查詢操作。大多數地方使用單個地方很多次,最後我們關閉。我們現在要確認的是,我們沒有關閉結果集變量,並且我們注意到內存的使用會波動。因此,在stmt獲得結果或結束之前立即關閉結果集的最佳機制是什麼關閉?關閉聲明是否足夠好,還是我們也必須關閉每個結果集?
回答
根據JDBC說明書和Statement.close()
API doc它應足以:
注意:當Statement對象被關閉時,它的當前ResultSet對象,如果存在的話,也被關閉。
基於此,你應該能夠假設你只需要關閉一個語句。然而,由於語句的使用壽命可能比使用從中獲取的單個ResultSet的壽命更長,因此通常儘快關閉ResultSet是個不錯的主意。
由於例如您再次使用它來執行另一個查詢,或者在PreparedStatement使用不同參數再次執行查詢時,語句可能會有更長的生命週期。在執行另一個查詢的情況下,先前獲得的ResultSet將被關閉。
這是繼續重複使用語句或每次使用新語句時的正確方法。我認爲重新使用它是一種實際的方法,可以正確地移動並保持安全,只需關閉結果集即可。 – user837306 2012-07-05 18:30:38
一般而言,您應該將'PreparedStatement'與參數化查詢一起使用,因爲這樣可以保護您免受SQL注入的影響,因爲只能爲相同查詢(使用不同參數)重複使用Statement。除此之外,重用陳述或創建新陳述並沒有真正的反對或反對。 – 2012-07-05 18:32:56
由於我們現在有很多疑問,因此我認爲我們需要一些時間才能進入準備狀態。所以如果我們移動到準備狀態,那麼對於每個查詢我們都必須使用新的Statement? – user837306 2012-07-05 18:58:20
完成後關閉它,與其他任何資源一樣。莫指出要堅持更長時間,特別是如果你想測量記憶,這意味着記憶問題。
我們不關閉stmt變量,因爲我們不斷地重複使用整個程序,並且只在最後的語句中關閉它才行。所以我們會在完成閱讀後立即關閉結果集,而不是在最後的聲明中表示沒問題? – user837306 2012-07-05 18:27:07
@ user837306'什麼時候完成'的部分不清楚? – EJP 2012-07-08 06:45:11
當你說完每個查詢的結束含義時,我不清楚你是在建議一個新的陳述嗎? – user837306 2012-07-10 05:20:09
- 1. 是否必須關閉()每個EntityManager?
- 2. WriteStream是否必須關閉?
- 3. 我們是否必須關閉會話對象?
- 4. 我是否必須明確關閉此文件?
- 5. 關閉連接是否自動關閉語句和結果集?
- 6. 關閉還是不關閉?
- 7. 我們是否總是要關閉流?
- 8. 我必須關閉FileInputStream嗎?
- 9. 它是關閉paren,關閉paren還是關閉paren?
- 10. 關閉Socket還是應該關閉流?
- 11. 我們是否需要關閉file_get_contents?
- 12. 我是否必須關閉由PrintStream包裝的FileOutputStream?
- 13. 用戶關閉表單時,是否必須關閉正在運行的BackgroundWorkers?
- 14. Lua DSL還是聰明的關閉?
- 15. 是否需要關閉準備好的聲明每次reassinging它還是可以在最後一次做
- 16. 關閉BufferedOutputStream是否也會關閉底層OutputStream?
- 17. 結果集功能'結果集關閉'
- 18. EF6,複合鍵,註釋足夠了嗎?還是我也必須使用Fluent API?
- 19. 聲明類/關閉
- 20. java.sql.SQLException:結果集關閉sqlite
- 21. SQLException:結果集關閉
- 22. SQLServerException:結果集被關閉
- 23. 值java.sql.SQLException:結果集關閉
- 24. 做jdbcTemplate關閉結果集?
- 25. 結果集關閉異常
- 26. 自動關閉結果集
- 27. SocketChannel.close()是否也關閉了套接字?
- 28. 如果關閉ServerSocket,ServerSocket接受的套接字是否也會關閉?
- 29. MySqlDataReader將必須被關閉
- 30. asp.net的DataReader,必須關閉
在我上一份工作中,我們發現ResultSet沒有達到查詢的末尾(就像如果你不在循環while(rs.next()))並且你沒有關閉它,它可能會泄漏資源,至少與甲骨文。如果將它運行到查詢結尾,它似乎不會泄漏。 – 2012-07-05 18:10:14
我建議您儘快關閉ResultSet,與Statement相同,與連接相同 – ControlAltDel 2012-07-05 18:11:40
我推薦'resultSet.getStatement()。close();'它關閉語句和ResultSet。 – jn1kk 2012-07-05 18:14:34