一、運做原理
在實際應用開發中,特別是在WEB應用系統中,若是JSP、Servlet或EJB使用
JDBC直接訪問數據庫中的數據,每一次數據訪問請求都必須經歷創建數據庫鏈接、打開數據庫、存取數據和關閉數據庫鏈接等步驟,而鏈接並打開數據庫是一件既消耗資源又費時的工做,若是頻繁發生這種數據庫操做,系統的性能必然會急劇降低,甚至會致使系統崩潰。數據庫鏈接池技術是解決這個問題最經常使用的方法,在許多應用程序服務器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了這項技術,無需本身編程,可是,深刻了解這項技術是很是必要的。
數據庫鏈接池技術的思想很是簡單,將數據庫鏈接做爲對象存儲在一個Vector對象中,一旦數據庫鏈接創建後,不一樣的數據庫訪問請求就能夠共享這些鏈接,這樣,經過複用這些已經創建的數據庫鏈接,能夠克服上述缺點,極大地節省系統資源和時間。
數據庫鏈接池的主要操做以下:
(1)創建數據庫鏈接池對象(服務器啓動)。
(2)按照事先指定的參數建立初始數量的數據庫鏈接(即:空閒鏈接數)。
(3)對於一個數據庫訪問請求,直接從鏈接池中獲得一個鏈接。若是數據庫鏈接池對象中沒有空閒的鏈接,且鏈接數沒有達到最大(即:最大活躍鏈接數),建立一個新的數據庫鏈接。
(4)存取數據庫。
(5)關閉數據庫,釋放全部數據庫鏈接(此時的關閉數據庫鏈接,並不是真正關閉,而是將其放入空閒隊列中。如實際空閒鏈接數大於初始空閒鏈接數則釋放鏈接)。
(6)釋放數據庫鏈接池對象(服務器中止、維護期間,釋放數據庫鏈接池對象,並釋放全部鏈接)
二、鏈接池模型
鏈接池包括一個鏈接池類(DBConnectionPool)和一個鏈接池管理類(DBConnetionPoolManager)。鏈接池類是對某一數據庫全部鏈接的「緩衝池」,主要實現如下功能:①從鏈接池獲取或建立可用鏈接;②使用完畢以後,把鏈接返還給鏈接池;③在系統關閉前,斷開全部鏈接並釋放鏈接佔用的系統資源;④還可以處理無效鏈接(原來登記爲可用的鏈接,因爲某種緣由再也不可用,如超時,通信問題),並可以限制鏈接池中的鏈接總數不低於某個預約值和不超過某個預約值。
鏈接池管理類是鏈接池類的外覆類(wrapper),符合單例模式,即系統中只能有一個鏈接池管理類的實例。其主要用於對多個鏈接池對象的管理,具備如下功能:①裝載並註冊特定數據庫的JDBC驅動程序;②根據屬性文件給定的信息,建立鏈接池對象;③爲方便管理多個鏈接池對象,爲每個鏈接池對象取一個名字,實現鏈接池名字與其實例之間的映射;④跟蹤客戶使用鏈接狀況,以便須要時關閉鏈接釋放資源。鏈接池管理類的引入主要是爲了方便對多個鏈接池的使用和管理,如系統須要鏈接不一樣的數據庫,或鏈接相同的數據庫但因爲安全性問題,須要不一樣的用戶使用不一樣的名稱和密碼。
三、鏈接池使用
上面所實現的鏈接池在程序開發時如何應用到系統中呢?下面以Servlet爲例說明鏈接池的使用。
Servlet的生命週期是:在開始創建servlet時,調用其初始化(init)方法。以後每一個用戶請求都致使一個調用前面創建的實例的service方法的線程。最後,當服務器決定卸載一個servlet時,它首先調用該servlet的 destroy方法。
根據servlet的特色,咱們能夠在初始化函數中生成鏈接池管理類的惟一實例(其中包括建立一個或多個鏈接池)。如:
public void init() throws ServletException
{
connMgr = DBConnectionManager.getInstance();
}
而後就能夠在service方法中經過鏈接池名稱使用鏈接池,執行數據庫操做。最後在destroy方法中釋放佔用的系統資源,如:
public void destroy() {
connMgr.release(); super.destroy();
}
四、結束語
在學習軟件開發的過程當中,數據庫鏈接的管理是個難點,須要你們下很大的功夫去理解去實踐,具體實例的數據庫鏈接,須要你們進行更深層次的擴展。