連接池主要由三部分組成:連接池的建立、連接池中連接使用的治理、連接池的關(guān)閉。下面就著重討論這三部分及連接池的配置問題。
1. 連接池原理
連接池技術(shù)的核心思想,是連接復(fù)用,通過建立一個數(shù)據(jù)庫連接池以及一套連接使用、分配、治理策略,使得該連接池中的連接可以得到高效、安全的復(fù)用,避免了數(shù)據(jù)庫連接頻繁建立、關(guān)閉的開銷。
另外,由于對JDBC中的原始連接進行了封裝,從而方便了數(shù)據(jù)庫應(yīng)用對于連接的使用(特別是對于事務(wù)處理),提高了開發(fā)效率,也正是因為這個封裝層的存在,隔離了應(yīng)用的本身的處理邏輯和具體數(shù)據(jù)庫訪問邏輯,使應(yīng)用本身的復(fù)用成為可能。
1.1 連接池的建立
應(yīng)用程序中建立的連接池其實是一個靜態(tài)的。所謂靜態(tài)連接池是指連接池中的連接在系統(tǒng)初始化時就已分配好,且不能隨意關(guān)閉連接。Java中提供了很多容器類可以方便的構(gòu)建連接池,如:Vector、Stack、Servlet、Bean等,通過讀取連接屬性文件Connections.properties與數(shù)據(jù)庫實例建立連接。在系統(tǒng)初始化時,根據(jù)相應(yīng)的配置創(chuàng)建連接并放置在連接池中,以便需要使用時能從連接池中獲取,這樣就可以避免連接隨意的建立、關(guān)閉造成的開銷。
1.2 連接池的治理
連接池治理策略是連接池機制的核心。當連接池建立后,如何對連接池中的連接進行治理,解決好連接池內(nèi)連接的分配和釋放,對系統(tǒng)的性能有很大的影響。連接的合理分配、釋放可提高連接的復(fù)用,降低了系統(tǒng)建立新連接的開銷,同時也加速了用戶的訪問速度。下面介紹連接池中連接的分配、釋放策略。
連接池的分配、釋放策略對于有效復(fù)用連接非常重要,我們采用的方法是一個很有名的設(shè)計模式:Reference Counting(引用記數(shù))。該模式在復(fù)用資源方面應(yīng)用的非常廣泛,把該方法運用到對于連接的分配釋放上,為每一個數(shù)據(jù)庫連接,保留一個引用記數(shù),用來記錄該連接的使用者的個數(shù)。
1.3 連接池的關(guān)閉
當應(yīng)用程序退出時,應(yīng)關(guān)閉連接池,此時應(yīng)把在連接池建立時向數(shù)據(jù)庫申請的連接對象統(tǒng)一歸還給數(shù)據(jù)庫(即關(guān)閉所有數(shù)據(jù)庫連接),這與連接池的建立正好是一個相反過程。
連接池分配一個連接后如定義一個數(shù)據(jù)集,點擊預(yù)覽,執(zhí)行完對應(yīng)的sql語句會將所占用的連接歸還連接池。
2. 連接池的配置
數(shù)據(jù)庫連接池中到底要放置多少個連接,才能使系統(tǒng)的性能更佳,用minConn和maxConn來限制。
minConn是當應(yīng)用啟動的時候連接池所創(chuàng)建的連接數(shù),假如過大啟動將變慢,但是啟動后響應(yīng)更快;假如過小啟動加快,但是最初使用的用戶將因為連接池中沒有足夠的連接不可避免的延緩了執(zhí)行速度。因此應(yīng)該在開發(fā)的過程中設(shè)定較小minConn,而在實際應(yīng)用的中設(shè)定較大minConn。maxConn是連接池中的最大連接數(shù),可以通過反復(fù)試驗來確定此飽和點。
為此在連接池類ConnectionPool中加入兩個方法getActiveSize()和getOpenSize(),ActiveSize 表示某一時間有多少連接正被使用,OpenSize表示連接池中有多少連接被打開,反映了連接池使用的峰值。將這兩個值在日志信息中反應(yīng)出來, minConn的值應(yīng)該小于平均ActiveSize,而maxConn的值應(yīng)該在activeSize和OpenSize之間。