數據庫連接池技術

最近用到一個數據庫連接池,由於要分析其各種性能指標,所以對數據庫連接池技術做了一個簡單的分析。從網上找到一個關於連接池設計的文章,寫的不 錯。我認爲:如果要設計一個數據庫連接池,可以參考它的基本思路;如果要提高性能,還有很多細節要仔細研究,並做細緻的分析對比。以下是轉載的文章。

連接池原理

連接池技術的核心思想是:連接複用,通過建立一個數據庫連接池以及一套連接使用、分配、治理策略,使得該連接池中的連接可以得到高效、安全的複用, 避免了數據庫連接頻繁建立、關閉的開銷。另外,由於對JDBC中的原始連接進行了封裝,從而方便了數據庫應用對於連接的使用(非凡是對於事務處理),提高 了開發效率,也正是因爲這個封裝層的存在,隔離了應用的本身的處理邏輯和具體數據庫訪問邏輯,使應用本身的複用成爲可能。連接池主要由三部分組成:連接池 的建立、連接池中連接的使用治理、連接池的關閉。下面就着重討論這三部分及連接池的配置問題。

1.1 連接池的建立

應用程序中建立的連接池其實是一個靜態的。所謂靜態連接池是指連接池中的連接在系統初始化時就已分配好,且不能隨意關閉連接。Java中提供了很多 容器類可以方便的構建連接池,如:Vector、Stack、Servlet、Bean等,通過讀取連接屬性文件 Connections.properties與數據庫實例建立連接。在系統初始化時,根據相應的配置創建連接並放置在連接池中,以便需要使用時能從連接 池中獲取,這樣就可以避免連接隨意的建立、關閉造成的開銷。

1.2 連接池的治理

連接池治理策略是連接池機制的核心。當連接池建立後,如何對連接池中的連接進行治理,解決好連接池內連接的分配和釋放,對系統的性能有很大的影響。 連接的合理分配、釋放可提高連接的複用,降低了系統建立新連接的開銷,同時也加速了用戶的訪問速度。下面介紹連接池中連接的分配、釋放策略。

連接池的分配、釋放策略對於有效複用連接非常重要,我們採用的方法是一個很有名的設計模式:Reference Counting(引用記數)。該模式在複用資源方面應用的非常廣泛,把該方法運用到對於連接的分配釋放上,爲每一個數據庫連接,保留一個引用記數,用來 記錄該連接的使用者的個數。具體的實現方法是:

當客戶請求數據庫連接時,首先查看連接池中是否有空閒連接(指當前沒有分配出去的連接)。假如存在空閒連接,則把連接分配給客戶並作相應處理(即標 記該連接爲正在使用,引用計數加1)。假如沒有空閒連接,則查看當前所開的連接數是不是已經達到maxConn(最大連接數),假如沒達到就重新創建一個 連接給請求的客戶;假如達到就按設定的maxWaitTime(最大等待時間)進行等待,假如等待maxWaitTime後仍沒有空閒連接,就拋出無空閒 連接的異常給用戶。

當客戶釋放數據庫連接時,先判定該連接的引用次數是否超過了規定值,假如超過就刪除該連接,並判定當前連接池內總的連接數是否小於 minConn(最小連接數),若小於就將連接池佈滿;假如沒超過就將該連接標記爲開放狀態,可供再次複用。可以看出正是這套策略保證了數據庫連接的有效 複用,避免頻繁地建立、釋放連接所帶來的系統資源開銷。

1.3 連接池的關閉

當應用程序退出時,應關閉連接池,此時應把在連接池建立時向數據庫申請的連接對象統一歸還給數據庫(即關閉所有數據庫連接),這與連接池的建立正好是一個相反過程。

1.4 連接池的配置

數據庫連接池中到底要放置多少個連接,才能使系統的性能更佳,用minConn和maxConn來限制。minConn是當應用啓動的時候連接池所 創建的連接數,假如過大啓動將變慢,但是啓動後響應更快;假如過小啓動加快,但是最初使用的用戶將因爲連接池中沒有足夠的連接不可避免的延緩了執行速度。 因此應該在開發的過程中設定較小minConn,而在實際應用的中設定較大minConn。maxConn是連接池中的最大連接數,可以通過反覆試驗來確 定此飽和點。爲此在連接池類ConnectionPool中加入兩個方法getActiveSize()和 getOpenSize(),ActiveSize 表示某一時間有多少連接正被使用,OpenSize表示連接池中有多少連接被打開,反映了連接池使用的峯值。將這兩個值在日誌信息中反應出來, minConn的值應該小於平均ActiveSize,而maxConn的值應該在activeSize和OpenSize之間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章