DBCP、c3p0、Druid三大連接配接池差別
如果一個項目中如果需要多個連接配接,如果一直擷取連接配接,斷開連接配接,這樣比較浪費資源;
如果建立一個池,用池來管理Connection,這樣就可以重複使用Connection。
有了池我們就不用自己來建立Connection,而是通過池來擷取Connection對象。當使用完Connection後,調用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池。
池就可以再利用這個Connection對象了。這裡我們常用的連接配接池有三種,分别是:DBCP連接配接池、C3P0連接配接池和DRUID連接配接池;
DBCP是一個依賴Jakarta commons-pool對象池機制的資料庫連接配接池.DBCP可以直接的在應用程式中使用,Tomcat的資料源使用的就是DBCP;
使用連接配接池的第一項工作就是導包,這裡需要的兩個jar包分别是:

在使用寫連接配接池工具類的時候,可以通過配置檔案來連接配接資料庫,配置檔案中記錄了連接配接資料庫的驅動、URL、使用者名和密碼等資訊;但要注意這裡的檔案字尾為:“.properties”。
把通過配置檔案連接配接資料庫的部分寫在靜态代碼塊中,随着類的加載隻加載一次。出了連接配接資料庫,還要提供一個獲得資料源的方法和一個擷取連接配接的方法;
下邊是把連接配接池寫成一個工具類的代碼,寫成工具類和直接使用的代碼幾乎相同,就不在重複的寫了。
配置檔案的部分内容:
代碼:(配置檔案的命名為:dbcp.properties)
在寫成工具類後都要對外提供一個資料源DateSource和一個連接配接Connection。作用是,如果我們在進行資料庫操作的時候要是使用DBUtils類的時候,就要使用QueryRunner核心類,而這個類在進行與資料庫連接配接的時候隻要一句代碼:QueryRunner qr=newQueryRunner(資料源);
通過連接配接池獲得:DBCPUtils.getDataSource()獲得。如果不使用DBUtils工具類,我們就可以直接通過DBCPUtils .getConnection()來直接獲得連接配接。
c3p0是一個開放源代碼的JDBC連接配接池,它在lib目錄中與Hibernate一起釋出,包括了實作jdbc3和jdbc2擴充規範說明的Connection 和Statement 池的DataSources 對象。
這種連接配接池在進行資料庫的連接配接的時候有兩種連接配接方法:使用配置檔案和不使用配置檔案兩種。
當然使用配置檔案的時候代碼要簡介的多,配置檔案中同樣是記錄了連接配接資料庫的驅動、URL、使用者名和密碼等資訊。
(1)不使用配置檔案的代碼:三個步驟:
<1>、導入核心類:ComboPooledDataSource
<2>、基本的四項設定,也就是設定驅動,URL,使用者名和密碼等四項。
<3>、其他四項。代碼如下:
(2)如果使用配置檔案連接配接資料庫,其中配置檔案中的内容為:
使用配置檔案進行連接配接的寫法如下:
我們可以通過連接配接池獲得:C3P0Utils.getDataSource() 獲得。如果不使用DBUtils工具類,我們就可以直接通過C3P0Utils.getConnection()來直接獲得連接配接。
Druid首先是一個資料庫連接配接池。Druid是目前最好的資料庫連接配接池,在功能、性能、擴充性方面,都超過其他資料庫連接配接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已經在阿裡巴巴部署了超過600個應用,經過一年多生産環境大規模部署的嚴苛考驗。
它不僅僅是一個資料庫連接配接池,它還包含一個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分析語義實作的。
使用步驟:
1,使用連接配接池的第一項工作就是導包,這裡需要的jar包分别是:druid-1.1.4.jar 1.1.4
2,druid.properties 檔案内容:
3,連接配接池工具類:
4,資料源工具類的使用:
我們從連接配接池配置的基本配置、關鍵配置、性能配置等主要配置來分析:
基本配置是指連接配接池進行資料庫連接配接的四個基本必需配置:
傳遞給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參數,用來檢測到目前使用的連接配接是否發生了連接配接洩露,是以在代碼内部就假定如果一個連接配接建立連接配接的時間很長,則将其認定為洩露,繼而強制将其關閉掉。
設定擷取連接配接失敗後,是否重新連接配接以及間隔時間。