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