[英]Is there a reason for never closing a JDBC connection?
我正在從上一個在系統上工作的開發人員那里讀取代碼,他從未關閉與數據庫的任何連接。 他僅關閉PreparedStatement
和ResultSet
連接,但不關閉Connection。
系統不使用連接池。
有什么理由不關閉所有內容( Connection
, PreparedStatement
和ResultSet
)嗎?
沒有充分的理由,這將導致應用程序非常脆弱。 如果存在網絡問題或數據庫在短時間內沒有響應,則數據庫連接很容易過時,並且依靠單個現有連接,沒有重新啟動應用程序就無法恢復。
還有其他壞處。 例如,通常會同步連接,因此,如果以此方式構建具有多個並發用戶的Web應用程序,則會限制應用程序的並發性。 但是,您的應用程序無法從瞬態問題中恢復就足以使它值得解決。
他可能使用相同的連接來執行所有SQL處理。 這不是一個壞技術。 但是,如果他沒有編寫干凈關閉的代碼,那么可能很難知道何時關閉唯一的連接。
因此,我敢打賭,這段代碼的基本原理是讓進程終止,套接字最終終止,然后讓遠程數據庫最終清除連接。 可以嗎,是的。 是的,很討厭,很容易出現問題的地方,是的。
解決此問題的方法是找到您的主循環。 一直在運行的那個。 然后,您需要通過將關閉邏輯放在主處理循環之后來控制關閉。 最后,您需要System.exit(...)
所有System.exit(...)
調用的代碼。
我假設由於您提到的代碼是繼承的,因此它是Java 1.6或更低版本。 在1.7及更高版本中,您可以在try with resources
語言的try with resources
隱式關閉一個Closeable
。
Connection
的文檔指出它擴展了AutoCloseable.
AutoCloseable的文檔指出,當類是“不再需要時必須關閉的資源”時,該類將對其進行擴展。 它提供了Close方法,您的朋友應該使用它。
ResultSet
還擴展了AutoCloseable
,但PreparedStatement
卻沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.