鏈接池原理

最近用到一個數據庫鏈接池,因爲要分析其各類性能指標,因此對數據庫鏈接池技術作了一個簡單的分析。從網上找到一個關於鏈接池設計的文章,寫的不錯。我認爲:若是要設計一個數據庫鏈接池,能夠參考它的基本思路;若是要提升性能,還有不少細節要仔細研究,並作細緻的分析對比。如下是轉載的文章。數據庫

鏈接池原理設計模式

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

1.1 鏈接池的創建ide

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

1.2 鏈接池的治理spa

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

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

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

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

1.3 鏈接池的關閉

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

1.4 鏈接池的配置

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

相關文章
相關標籤/搜索