2012-12-24 118 views
18

我知道Java中的安全模式是在finally塊中依次關閉ResultSet,Statement和Connection。關閉連接是否自動關閉語句和結果集?

如果關閉連接,然後嘗試關閉語句(不拋出異常)。但是,如果您嘗試從語句中調用任何方法,則會引發異常。

我想知道關閉連接會自動關閉所有由該連接創建的語句對象嗎?

更新:
我使用DatabaseProductVersion:Oracle數據庫11g第二版11.1.0.0.0
的DriverName:Oracle JDBC驅動程序
DriverVersion:10.2.0.4.0

+2

http://stackoverflow.com/questions/4507440/must-jdbc-resultsets-and-statements-be-closed-separately-although-the-connection –

回答

14

是的,Connection.close API中提到「立即釋放此Connection對象的數據庫和JDBC資源,而不是等待它們被自動釋放」。問題在於應用程序通常使用數據庫連接池,這些連接池可能只是將Connection返回到Connection.close上的池。

無論如何,最好總是直接關閉ResultSet和Statement,而不要依賴Connection.close。

此外,直接使用JDBC並不是最好的想法。你可以使用Spring JDBC,而忘記釋放資源的問題。

+2

編寫良好的連接池應該關閉相關的底層資源(其他比連接本身)在連接關閉時。寫得好的客戶端代碼不應該依賴於此。在實踐中,大多數事情都寫得很糟糕,而且你的代碼很可能會聞到玫瑰的氣味。 –

+1

對。我決定用Apache的BasicDataSource測試它:我打開了conn,創建了stmt,關閉了conn並運行了查詢。 SQLException「[email protected]」已關閉「 –

+0

」這不是直接使用JDBC的最佳想法「。爲什麼不呢?在某些情況下,Spring可能有用,但在其他情況下,只會產生不必要的開銷。 –

2

的細節,最終到每個JDBC司機執行;但是,一旦與數據庫的連接關閉,與它相關的所有內容都將放置在數據庫端,因此客戶端可以執行的任何操作都不會自動關閉表示這些資源的對象。

您永遠不知道數據庫/驅動程序可能被破壞的方式(例如可能存在資源泄漏),因此最佳實踐建議是明確關閉所有內容。