了解c3p0,dbcp與druid
###DBCP
DBCP是一個依賴Jakarta
commons-pool對象池機制的數據庫連接池.DBCP可以直接的在應用程序中使用,Tomcat的數據源使用的就是DBCP。
###c3p0
c3p0是一個開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發布,包括了實現jdbc3和jdbc2擴展規范說明的Connection
和Statement 池的DataSources 對象。
###Druid
阿里出品,淘寶和支付寶專用數據庫連接池,但它不僅僅是一個數據庫連接池,它還包含一個
ProxyDriver,一系列內置的JDBC組件庫,一個 SQL Parser。支持所有JDBC兼容的數據庫,包括
Oracle、MySql、Derby、Postgresql、SQL Server、H2等等。Druid針對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分析語義實現的。
看上面應該了解到功能上druid很厲害。
#c3p0,dbcp與druid 的屬性配置
再說說他們的屬性吧,連接池配置大體可以分為基本配置、關鍵配置、性能配置等主要配置。
###基本配置
基本配置是指連接池進行數據庫連接的四個基本必需配置:
傳遞給JDBC驅動的用於連接數據庫的用戶名、密碼、URL以及驅動類名。
注:
在Druid連接池的配置中,driverClassName可配可不配,
如果不配置會根據url自動識別dbType(數據庫類型),然后選擇相應的driverClassName。
###關鍵配置
關鍵配置:為了發揮數據庫連接池的作用,在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。
無論這些數 據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。
連接池的最大數據庫連接數量限定了這個連接池能占有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。
最小連接數:
是數據庫一直保持的數據庫連接數,所以如果應用程序對數據庫連接的使用量不大,將有大量的數據庫資源被浪費。
初始化連接數:
連接池啟動時創建的初始化數據庫連接數量。
最大連接數:
是連接池能申請的最大連接數,如果數據庫連接請求超過此數,后面的數據庫連接請求被加入到等待隊列中。
最大等待時間:
當沒有可用連接時,連接池等待連接被歸還的最大時間,超過時間則拋出異常,
可設置參數為0或者負數使得無限等待(根據不同連接池配置)。
注1:
在DBCP連接池的配置中,還有一個maxIdle的屬性,表示最大空閑連接數,
超過的空閑連接將被釋放,默認值為8。
對應的該屬性在Druid連接池已不再使用,配置了也沒有效果,c3p0連接池則沒有對應的屬性。注2:
數據庫連接池在初始化的時候會創建initialSize個連接,當有數據庫操作時,會從池中取出一個連接。
如果當前池中正在使用的連接數等 於maxActive,則會等待一段時間,等待其他操作釋放掉某一個連接,如果這個等待時間超過了maxWait,則會報錯;
如果當前正在使用的連接數沒 有達到maxActive,則判斷當前是否空閑連接,如果有則直接使用空閑連接,如果沒有則新建立一個連接。
在連接使用完畢后,不是將其物理連接關閉,而 是將其放入池中等待其他操作復用。
###性能配置:
預緩存設置:
即是PSCache,PSCache對支持游標的數據庫性能提升巨大,比如說oracle。JDBC的標准參數,用以控制數據源內加載的
PreparedStatements數量。但由於預緩存的statements屬於單個connection而不是整個連接池,所以設置這個參數需要考
慮到多方面的因素。
單個連接擁有的最大緩存數:要啟用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改為true。在Druid中,不會存在Oracle下PSCache占用內存過多的問題,可以把這個數值配置大一些,比如說100
連接有效性檢測設置:
連接池內部有機制判斷,如果當前的總的連接數少於miniIdle,則會建立新的空閑連接,以保證連接數得到miniIdle。如果當前連接池中某
個連接在空閑了timeBetweenEvictionRunsMillis時間后任然沒有使用,則被物理性的關閉掉。有些數據庫連接的時候有超時限制
(mysql連接在8小時后斷開),或者由於網絡中斷等原因,連接池的連接會出現失效的情況,這時候設置一個testWhileIdle參數為true,
可以保證連接池內部定時檢測連接的可用性,不可用的連接會被拋棄或者重建,最大情況的保證從連接池中得到的Connection對象是可用的。當然,為了
保證絕對的可用性,你也可以使用testOnBorrow為true(即在獲取Connection對象時檢測其可用性),不過這樣會影響性能。
超時連接關閉設置:
removeAbandoned參數,用來檢測到當前使用的連接是否發生了連接泄露,所以在代碼內部就假定如果一個連接建立連接的時間很長,則將其認定為泄露,繼而強制將其關閉掉。
c3p0重連設置:
設置獲取連接失敗后,是否重新連接以及間隔時間。
#各個連接池的屬性說明
###DBCP 屬性說明表
###C3P0 屬性說明表
###DRUID 屬性說明表