2009-06-03 998 views
4

我在我的應用程序中使用連接池。我的問題是:在連接池環境中明確需要statement.close()嗎?

在連接池環境的情況下是否顯式要求在關閉連接之前關閉語句?

在連接池環境連接沒有關閉,(但返回到空閒連接池)。 我檢查了jdbc 4.0功能規格。在第9.4.4點中,它明確指出:

關閉連接對象應用程序調用方法Connection.close來指示它已完成使用連接。當調用對象的close方法時,從給定Connection對象創建的所有Statement對象都將被關閉。一旦Connection被關閉,除close,isClosed或isValid方法外,任何嘗試訪問其任何方法的嘗試都將導致拋出SQLException。

因此,jdbc規範強制在關閉連接時關閉所有語句。那麼它僅適用於僅適用於非連接池環境還是適用於連接池環境?

根據我的觀點,在彙集環境的情況下應該沒有問題,因爲我們正在編寫接口(java.sql.Connection & java.sql.Statement)。所以我們不打擾實現,父類(java.sql.Connection)沒有關於子/阻塞類(Vendor實現類)的任何信息。

+0

如果jdbc規範要求在關閉連接時關閉語句的所有實現,那麼當我們使用connection.close方法(在連接池或非池化環境中)時,我們可以輕鬆地跳過statement.close方法。 – 2009-06-03 16:37:36

+0

...這是一個問題嗎? – 2009-06-03 18:47:43

回答

4

任何具有close(),release(),destroy()等的對象都會自動建議(當然你應該閱讀API文檔,可能會有不同的名稱用於此目的)對象需要調用此方法以確保在對象不再使用時釋放對象資源。將沒有理由提供此類一個方法,如果對象可以自己做到這一點。

在java.sql.Connection中彙集的情況下,連接是不是真的關閉,只是被推回到池可用連接,但這內部的東西又名你不應該在乎

7

絕對。有可能Statement實現將有其他資源應該被釋放,或者與連接有其他的關係。你不知道實現細節,也不應該知道實現細節。

你的方法是絕對正確的:編寫接口並避免稍後可能會輕易咬住你的「捷徑」。 (即使它現在有效,它可能不會在將來版本的池或連接類中)。

+1

我在大學數據庫課上的其他學生可以證明調用.close的重要性。我的應用程序忽略了關閉並最終在數據庫服務器上創建了大量延遲的連接。以至於它開始阻止創建新的連接。項目到期前一天晚上。 – JaredPar 2009-06-03 16:30:31

2

根據我的經驗,一些JDBC驅動程序有錯誤。如果手動關閉所有語句(和ResultSet),它們似乎工作得最好。否則,我發現資源泄漏不應該持續超過Connection的關閉。