概述
說到druid,這個還是以前在開源中國項目中看到的,說是比較好的數據連接池。今天就分享下常見的三大連接池--c3p0,dbcp與druid。
功能
1、DBCP
DBCP是一個依賴Jakarta commons-pool對象池機制的數據庫連接池。DBCP可以直接的在應用程序中使用,Tomcat的數據源使用的就是DBCP。
單獨使用 dbcp 需要2個包:commons-dbcp.jar,commons-pool.jar
由于建立數據庫連接是一個非常耗時耗資源的行為,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完后再放回去。
2、c3p0
c3p0是一個開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發布,包括了實現jdbc3和jdbc2擴展規范說明的Connection 和Statement 池的DataSources 對象。
c3p0 is an easy-to-use library for augmenting traditional (DriverManager-based) JDBC drivers with JNDI-bindable DataSources, including DataSources that implement Connection and Statement Pooling, as described by the jdbc3 spec and jdbc2 std extension.
3、Druid
阿里出品,淘寶和支付寶專用數據庫連接池,但它不僅僅是一個數據庫連接池,它還包含一個ProxyDriver,一系列內置的JDBC組件庫,一個 SQL Parser。支持所有JDBC兼容的數據庫,包括Oracle、MySQL、Derby、Postgresql、SQL Server、H2等等。
Druid架構
Druid首先是一個數據庫連接池。Druid是目前最好的數據庫連接池,在功能、性能、擴展性方面,都超過其他數據庫連接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。
Druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環境大規模部署的嚴苛考驗。
Druid是一個JDBC組件,它包括三個部分:
1)基于Filter-Chain模式的插件體系
2)DruidDataSource 高效可管理的數據庫連接池
3)SQL Parser
Druid支持所有JDBC兼容的數據庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等,并且Druid針對Oracle和MySql做了特別優化,比如Oracle的PS Cache內存占用優化,MySql的ping檢測優化。
通過Druid提供的監控功能,監控SQL的執行時間、ResultSet持有時間、返回行數、更新行數、錯誤次數、錯誤堆棧信息,可以清楚知道連接池和SQL的工作情況,能夠詳細統計SQL的執行性能,這對于線上分析數據庫訪問性能有幫助。
各自屬性
連接池配置大體可以分為基本配置、關鍵配置、性能配置等主要配置。
1、基本配置
基本配置是指連接池進行數據庫連接的四個基本必需配置:
傳遞給JDBC驅動的用于連接數據庫的用戶名、密碼、URL以及驅動類名。
注:在Druid連接池的配置中,driverClassName可配可不配,如果不配置會根據url自動識別dbType(數據庫類型),然后選擇相應的driverClassName。
2、關鍵配置
關鍵配置:為了發揮數據庫連接池的作用,在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。連接池的最大數據庫連接數量限定了這個連接池能占有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。
1)最小連接數:
是數據庫一直保持的數據庫連接數,所以如果應用程序對數據庫連接的使用量不大,將有大量的數據庫資源被浪費。
2)初始化連接數:
連接池啟動時創建的初始化數據庫連接數量。
3)最大連接數:
是連接池能申請的最大連接數,如果數據庫連接請求超過此數,后面的數據庫連接請求被加入到等待隊列中。
4)最大等待時間:
當沒有可用連接時,連接池等待連接被歸還的最大時間,超過時間則拋出異常,可設置參數為0或者負數使得無限等待(根據不同連接池配置)。
3、 性能配置
1)預緩存設置:
即是PSCache,PSCache對支持游標的數據庫性能提升巨大,比如說oracle。JDBC的標準參數,用以控制數據源內加載的 PreparedStatements數量。但由于預緩存的statements屬于單個connection而不是整個連接池,所以設置這個參數需要考 慮到多方面的因素。
單個連接擁有的最大緩存數:要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache占用內存過多的問題,可以把這個數值配置大一些,比如說100
2)連接有效性檢測設置:
連接池內部有機制判斷,如果當前的總的連接數少于miniIdle,則會建立新的空閑連接,以保證連接數得到miniIdle。如果當前連接池中某 個連接在空閑了timeBetweenEvictionRunsMillis時間后任然沒有使用,則被物理性的關閉掉。有些數據庫連接的時候有超時限制 (mysql連接在8小時后斷開),或者由于網絡中斷等原因,連接池的連接會出現失效的情況,這時候設置一個testWhileIdle參數為true, 可以保證連接池內部定時檢測連接的可用性,不可用的連接會被拋棄或者重建,最大情況的保證從連接池中得到的Connection對象是可用的。
當然,為了 保證絕對的可用性,你也可以使用testOnBorrow為true(即在獲取Connection對象時檢測其可用性),不過這樣會影響性能。
3)超時連接關閉設置:
removeAbandoned參數,用來檢測到當前使用的連接是否發生了連接泄露,所以在代碼內部就假定如果一個連接建立連接的時間很長,則將其認定為泄露,繼而強制將其關閉掉。