一直沒有搞清楚,JDBC的資料來源與串連池是怎麼一樣的關係,直到今天做系統的時候,遇到了串連池如果管理有效串連及資源的佔用,釋放的問題.
資料來源並不等於串連池,它不是必須要求實現串連池的,即串連池是資料來源的一種.下面的一段網上摘要可以佐證:
除了提高效能和延展性以外,JDBC應用看不出在擷取DataSource對象來實現串連池和不擷取之間有任何不同。然而,在應用伺服器和驅動級實現之間有一些重要的區別。
一個基礎DataSource實現,沒有實現串連池,典型的,由JDBC驅動廠商提供。在基礎DataSource實現中,下面的是真實的:
- DataSource?.getConnection方法建立一個新的Connection對象,來代表一個物理串連並封裝對該串連的所有安裝和管理工作。
- Connection.close方法關閉物理串連並釋放相關資源。
在包括串連池的DataSource實現中,在幕後有一系列重大事件發生。在如上實現中,下面的是真實的:
- DataSource?實現包括一個實現的指定串連池模組會管理一緩衝區的PooledConnection對象。DataSource對象典型的由應用伺服器實現作為一層在驅動實現ConnectionPoolDataSource和PooledConnection介面的頂層。
- DataSource?.getConnection 調用PooledConnection.getConnection方法來獲得一個指定物理串連的邏輯控制代碼。只有當串連池中沒有可用的串連時,才會出現建 立新物理串連的花費。當需要一個新的物理串連時,串連池管理器會調用ConnectionPoolDataSource的 getPooledConnection方法來建立一個。管理物理串連的工作由PooledConnection對象代理。
- Connection.close方法關閉邏輯控制代碼,但物理串連還存在。串連池管理器被通知指定的PooledConnection對象現在可以重用了。如果應用程式試圖重用邏輯控制代碼,Connection實現會拋出一個SQLException。
- 單一一個物理PooledConnection對象會在生命期內產生許多邏輯Connection對象。對一個給定的PooledConnection對 象,只有最新產生的邏輯Connection對象才有效。當相關的PooledConnection.getConnection被調用時,任何先前存在 的Connection對象會被自動關閉。監聽器(串連池管理器)不會被通知該事件。
- 一個串連池管理器通過調用PooledConnection.close方法關閉物理串連。該方法典型的只有在特定環境下被調用:當應用伺服器遇到正常的關閉,當串連緩衝區正在被重新初始化,或者當應用伺服器收到一個事件指出串連出現一個無法恢複的錯誤時。
在使用conection及statement後應該關閉,不然會由於垃圾收集器不能有效釋放資源而導致資料庫的遊標使用超過限制,而出現SQLException異常.
連結:
http://www.pgsqldb.org/twiki/bin/view/PgSQL/ConnectionPool 關於串連池的文檔