概述
數據庫鏈接池負責分配、管理和釋放數據庫鏈接,它容許應用程序重複使用一個現有的數據庫鏈接,而不是再從新創建一個;釋放空閒時間超過最大空閒時間的數據庫鏈接來避免由於沒有釋放數據庫鏈接而引發的數據庫鏈接遺漏。 這項技術能明顯提升對數據庫操做的性能。它其實就是一個容器,用來存放數據庫鏈接對象的容器。java
背景
數據庫鏈接是一種關鍵的、有限的、昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤其突出。對數據庫鏈接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。數據庫鏈接池正是針對這個問題提出來的。sql
影響因素
數據庫鏈接池在初始化時將建立必定數量的數據庫鏈接放到鏈接池中,這些數據庫鏈接的數量是由最小數據庫鏈接數制約。不管這些數據庫鏈接是否被使用,鏈接池都將一直保證至少擁有這麼多的鏈接數量。鏈接池的最大數據庫鏈接數量限定了這個鏈接池能佔有的最大鏈接數,當應用程序向鏈接池請求的鏈接數超過最大鏈接數量時,這些請求將被加入到等待隊列中。數據庫鏈接池的最小鏈接數和最大鏈接數的設置要考慮到下列幾個因素:數據庫
最小鏈接數
是鏈接池一直保持的數據庫鏈接,因此若是應用程序對數據庫鏈接的使用量不大,將會有大量的數據庫鏈接資源被浪費。服務器
最大鏈接數
是鏈接池能申請的最大鏈接數,若是數據庫鏈接請求超過此數,後面的數據庫鏈接請求將被加入到等待隊列中,這會影響以後的數據庫操做。工具
最小鏈接數與最大鏈接數差距
最小鏈接數與最大鏈接數相差太大,那麼最早的鏈接請求將會獲利,以後超過最小鏈接數量的鏈接請求等價於創建一個新的數據庫鏈接。不過,這些大於最小鏈接數的數據庫鏈接在使用完不會立刻被釋放,它將被放到鏈接池中等待重複使用或是空閒超時後被釋放。
原理
鏈接池基本的思想是在系統初始化的時候,將數據庫鏈接做爲對象存儲在內存中,當用戶須要訪問數據庫時,並不是創建一個新的鏈接,而是從鏈接池中取出一個已創建的空閒鏈接對象。使用完畢後,用戶也並不是將鏈接關閉,而是將鏈接放回鏈接池中,以供下一個請求訪問使用。而鏈接的創建、斷開都由鏈接池自身來管理。同時,還能夠經過設置鏈接池的參數來控制鏈接池中的初始鏈接數、鏈接的上下限數以及每一個鏈接的最大使用次數、最大空閒時間等等。也能夠經過其自身的管理機制來監視數據庫鏈接的數量、使用狀況等。性能
Java中的數據庫鏈接池
- C3P0:是一個開放源代碼的JDBC鏈接池,它在lib目錄中與Hibernate一塊兒發佈,包括了實現jdbc3和jdbc2擴展規範說明的Connection 和Statement 池的DataSources 對象。
- Proxool:是一個Java SQL Driver驅動程序,提供了對選擇的其它類型的驅動程序的鏈接池封裝。能夠很是簡單的移植到現存的代碼中,徹底可配置,快速、成熟、健壯。能夠透明地爲現存的JDBC驅動程序增長鏈接池功能。
- Jakarta DBCP:DBCP是一個依賴Jakartacommons-pool對象池機制的數據庫鏈接池。DBCP能夠直接的在應用程序中使用。
- DDConnectionBroker:是一個簡單、輕量級的數據庫鏈接池。
- DBPool:是一個高效、易配置的數據庫鏈接池。它除了支持鏈接池應有的功能以外,還包括了一個對象池,使用戶可以開發一個知足本身需求的數據庫鏈接池。
- XAPool:是一個XA數據庫鏈接池。它實現了javax.sql.XADataSource並提供了鏈接池工具。
- Primrose:是一個Java開發的數據庫鏈接池。當前支持的容器包括Tomcat4&五、Resin3與JBoss3。它一樣也有一個獨立的版本,能夠在應用程序中使用而沒必要運行在容器中。Primrose經過一個WEB接口來控制SQL處理的追蹤、配置,以及動態池管理。在重負荷的狀況下可進行鏈接請求隊列處理。
- SmartPool:是一個鏈接池組件,它模仿應用服務器對象池的特性。SmartPool可以解決一些臨界問題如鏈接泄漏(connection leaks)、鏈接阻塞、打開的JDBC對象(如Statements、PreparedStatements)等。SmartPool的特性包括:
- 支持多個pool
- 自動關閉相關聯的JDBC對象
- 在所設定time-outs以後察覺鏈接泄漏
- 追蹤鏈接使用狀況
- 強制啓用最近最少用到的鏈接
- 把SmartPool「包裝」成現存的一個pool
- MiniConnectionPoolManager:是一個輕量級JDBC數據庫鏈接池。它只須要Java1.5(或更高)而且沒有依賴第三方包。
- BoneCP:是一個快速、開源的數據庫鏈接池。幫用戶管理數據鏈接,讓應用程序能更快速地訪問數據庫。比C3P0/DBCP鏈接池速度快25倍。
-
Druid:Druid不只是一個數據庫鏈接池,還包含一個ProxyDriver、一系列內置的JDBC組件庫、一個SQL Parser。
支持全部JDBC兼容的數據庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等。針對Oracle和MySql作了特別優化,好比:
- Oracle的PS Cache內存佔用優化
- MySql的ping檢測優化
Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,這是一個手寫的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象語法樹很方便。大數據
簡單SQL語句用時10微秒之內,複雜SQL用時30微秒。優化
經過Druid提供的SQL Parser能夠在JDBC層攔截SQL作相應處理,好比說分庫分表、審計等。Druid防護SQL注入攻擊的WallFilter,就是經過Druid的SQL Parser分析語義實現的。ui