你都說是數據庫連接池了。那就是連接數據庫用的。JDBC是java封裝的對數據庫的操作。當然你可以自己進一步封裝。數據庫連接池是JDBC使用的前提,如果連數據庫連接池都沒連上,JDBC的操作就談不上了。而光有數據庫連接池也沒用啊,你連上了數據庫不對其進行操作不是白連了么。所以就需要JDBC了。
一直沒有搞清楚,JDBC的數據源與連接池是怎么一樣的關系,直到今天做系統的時候,遇到了連接池如果管理有效的連接及資源的占用,釋放的問題.
數據源並不等於連接池,它不是必須要求實現連接池的,即連接池是數據源的一種.下面的一段網上摘要可以佐證:
一個基礎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異常.所以在以后使用jdbc的時候不要把createStatement和prepareStatement都應該要放在循環外面,而且使用了這些Statment后,及時關閉。最好是在執行了一次executeQuery、executeUpdate等之后,如果不需要使用結果集(ResultSet)的數據,就馬上將Statment關閉。