2012-09-22 29 views
9

如果我使用DriverManager.getConnection()DataSource.getConnection()獲得連接對象,那麼在這些對象上調用.close()時,它們在行爲上的差異如何?連接行爲 - DriverManager.getConnection()和DataSource.getConnection()

之前.close()方法調用,我得到了相關的StatementResultSet對象從這兩個不同的連接。獲取這兩個對象後不久,如果我說connection1.close()(通過DriverManager.getConnection()),它將使連接對象無效,並且我不應該/允許訪問相關的Statement和ResultSet對象。如我錯了請糾正我?

第二種情況,現在如果我說connection2.close()(通過DataSource.getConnection()),它只是將它返回到池。但連接仍然存在。我能訪問關聯的StatementResultSet對象嗎?

回答

6

如果我們假設(基本)DataSource(即:不進行連接池),那麼您獲得的物理連接與從DriverManager獲得的物理連接相同(某些驅動程序甚至在內部使用來自DataSource的DriverManager或來自DriverManager的數據源)。所以這些連接將表現相同。

現在,如果我們假設DataSource提供連接池,那麼數據源本身使用ConnectionPoolDataSource(或類似的內部機制)來獲得PooledConnection。這個PooledConnection管理到數據庫的實際物理連接。

當用戶請求來自DataSource的連接時,DataSource將簽出一個PooledConnection並請求其爲Connection。然後,PooledConnection將創建一個使用或包裝物理連接的邏輯連接(例如使用代理)。 DataSource會將該邏輯連接返回給用戶。

對於用戶來說,邏輯連接應該在所有方面表現爲與物理連接相同。因此,當用戶關閉連接時,該邏輯連接和所有從屬JDBC對象將關閉,並且與物理連接關閉相同。

JDBC 4.1 11.1節說:

連接池是完全透明的客戶端:一個客戶端獲得一個彙集 連接,並使用它只是它獲得相同的方式,並使用非池連接。

而部分11.4:

如果應用程序試圖重新使用邏輯手柄,連接實現 拋出SQLException。

對於給定的PooledConnection對象,只有最最近生產的邏輯連接對象將是有效的。當調用關聯的PooledConnection.getConnection方法時,以前存在的任何Connection對象都會自動關閉。

然而,在背景中,當邏輯連接被關閉時,的PooledConnection將發信號的數據源,它可用於複用,然後將數據源將其返回到連接池,或關閉的PooledConnection(封閉物理連接),如果它不再需要連接。

通過要求PooledConnection關閉邏輯連接,DataSource還可以強制撤銷用戶的連接(例如,當連接檢出時間太長等)。

+0

在我的應用程序中,即使關閉了我的Connection對象,我也能夠訪問我的ResultSet對象。因此,按照您的說明,Websphere未能實現此目標? – Sriram

+0

這取決於您的訪問意味着什麼。 ResultSet對象仍然存在,但不應該能夠使用ResultSet,因爲在關閉邏輯連接時它應該已經關閉。 –

+1

如果這是WebSphere的不正確實現:這取決於您將什麼用作Websphere的'DataSource'的'ConnectionPoolDataSource'。我描述的行爲應該由'PooledConnection'實現來強制執行。 –

3

connection1.close()(通過的DriverManager.getConnection()),

這將關閉與數據庫建立的物理連接和所有的資源,即結果集,語句,連接被釋放。因此,連接關閉後無法訪問它們。

connection2.close()(通過的DataSource.getConnection())

這是數據源的實現依賴等行爲不必在不同數據源的實現是一致的。另外,在給定的DataSource實現中,連接的實際生命週期取決於各種其他參數,強烈建議不要將此連接與通過DriverManager獲取的連接區分開來。

如果你真的想在ResultSet保存的數據是可用的StatementConnection被關閉後,你可以,如果適合您的用例,看看CachedRowSet

+2

從連接池獲取的邏輯連接應該(對用戶)表現得與從DriverManager獲得的物理連接完全相同。因此,即使物理連接保持打開狀態,連接和所有相關對象也應該關閉。如果一個數據源實現的行爲不然,那麼它不符合JDBC規範。 –

3

客戶端緩存可能依賴於用於連接的驅動程序不確定。 但是,一旦連接關閉,某些驅動程序明確阻止您使用語句或結果集。其他人維護客戶端的結果集

相關問題