一 整體評價對比
簡介 | 使用評價 | 項目主頁 | |
DBCP | DBCP是一個依賴Jakarta commons-pool對象池機制的數據庫連接池.DBCP可以直接的在應用程序用使用 | 可以設置最大和最小連接,連接等待時間等,基本功能都有,此連接池的持續運行的穩定性還是可以,不過速度稍慢,在大併發量的壓力下穩定性有所下降,此外不提供連接池監控 | http://commons.apache.org/proper/commons-dbcp/configuration.html |
C3P0 | C3P0是一個開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發佈,包括了實現jdbc3和jdbc2擴展規範說明的Connection 和Statement 池的DataSources 對象。 | 連接池可以設置最大和最小連接,連接等待時間等,基本功能都有,連接池的持續運行的穩定性相當不錯,在大併發量的壓力下穩定性也有一定保證,此外不提供連接池監控。 | http://sourceforge.net/projects/c3p0 |
Proxool | 這是一個Java SQL Driver驅動程序,提供了對你選擇的其它類型的驅動程序的連接池封裝。可以非常簡單的移植到現存的代碼中。完全可配置。快速,成熟,健壯。可以透明地爲你現存的JDBC驅動程序增加連接池功能。 | 連接池可以設置最大和最小連接,連接等待時間等,基本功能都有,連接池的持續運行的穩定性有一定問題,有一個優勢--連接池監控 | http://proxool.sourceforge.net/ |
BoneCP | BoneCP是一個快速,開源的數據庫連接池。幫你管理數據連接讓你的應用程序能更快速地訪問數據庫。比C3P0/DBCP連接池快25倍 | 一種新的數據連接技術,以其效率高,速度 快著稱,連接池可以設置最大和最小連接,連接等待時間等,基本功能都有 | http://www.jolbox.com/ |
二 參數說明
參數說明 | |
DBCP |
dataSource: 要連接的 datasource (通常我們不會定義在 server.xml) defaultAutoCommit: 對於事務是否 autoCommit, 默認值爲 true defaultReadOnly: 對於數據庫是否只能讀取, 默認值爲 false driverClassName:連接數據庫所用的 JDBC Driver Class, maxActive: 可以從對象池中取出的對象最大個數,爲0則表示沒有限制,默認爲8 maxIdle: 最大等待連接中的數量,設 0 爲沒有限制 (對象池中對象最大個數) minIdle:對象池中對象最小個數 maxWait: 最大等待秒數, 單位爲 ms, 超過時間會丟出錯誤信息 password: 登陸數據庫所用的密碼 url: 連接數據庫的 URL username: 登陸數據庫所用的帳號 validationQuery: 驗證連接是否成功, SQL SELECT 指令至少要返回一行 removeAbandoned: 是否自我中斷, 默認是 false removeAbandonedTimeout: 幾秒後會自我中斷, removeAbandoned 必須爲 true logAbandoned: 是否記錄中斷事件, 默認爲 false minEvictableIdleTimeMillis:大於0 ,進行連接空閒時間判斷,或爲0,對空閒的連接不進行驗證;默認30分鐘 timeBetweenEvictionRunsMillis:失效檢查線程運行時間間隔,如果小於等於0,不會啓動檢查線程,默認-1 testOnBorrow:取得對象時是否進行驗證,檢查對象是否有效,默認爲false testOnReturn:返回對象時是否進行驗證,檢查對象是否有效,默認爲false testWhileIdle:空閒時是否進行驗證,檢查對象是否有效,默認爲false initialSize:初始化線程數 |
C3P0 |
acquireIncrement: 當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 acquireRetryAttempts: 定義在從數據庫獲取新連接失敗後重復嘗試的次數。Default: 30 acquireRetryDelay: 兩次連接中間隔時間,單位毫秒。Default: 1000 autoCommitOnClose: 連接關閉時默認將所有未提交的操作回滾。Defaul t: false automaticTestTable: c3p0將建一張名爲Test的空表,並使用其自帶的查詢語句進行測試。如果定義了這個參數那麼屬性preferredTestQuery將被忽略。你不 能在這張Test表上進行任何操作,它將只供c3p0測試使用。Default: null breakAfterAcquireFailure: 獲取連接失敗將會引起所有等待連接池來獲取連接的線程拋出異常。但是數據源仍有效保留,並在下次調用getConnection()的時候繼續嘗試獲取連 接。如果設爲true,那麼在嘗試獲取連接失敗後該數據源將申明已斷開並永久關閉。Default: false checkoutTimeout:當連接池用完時客戶端調用getConnection()後等待獲取新連接的時間,超時後將拋出SQLException,如設爲0則無限期等待。單位毫秒。Default: 0 connectionTesterClassName: 通過實現ConnectionTester或QueryConnectionT ester的類來測試連接。類名需制定全路徑。Default: com.mchange.v2.c3p0.impl.Def aultConnectionTester factoryClassLocation: 指定c3p0 libraries的路徑,如果(通常都是這樣)在本地即可獲得那麼無需設置,默認null即可Default: null idleConnectionTestPeriod: 每60秒檢查所有連接池中的空閒連接。Defaul t: 0 initialPoolSize: 初始化時獲取三個連接,取值應在minPoolSize與maxPoolSize之間。Default: 3 maxIdleTime: 最大空閒時間,60秒內未使用則連接被丟棄。若爲0則永不丟棄。Default: 0 maxPoolSize: 連接池中保留的最大連接數。Default: 15 maxStatements: JDBC的標準參數,用以控制數據源內加載的PreparedSt atements數量。但由於預緩存的statements屬於單個connection而不是整個連接池。所以設置這個參數需要考慮到多方面的因素。如 果maxStatements與maxStatementsPerConnection均爲0,則緩存被關閉。Default: 0 maxStatementsPerConnection: maxStatementsPerConnection定義了連接池內單個連接所擁有的最大緩存statements數。Default: 0 numHelperThreads:c3p0是異步操作的,緩慢的JDBC操作通過幫助進程完成。擴展這些操作可以有效的提升性能通過多線程實現多個操作同時被執行。Default: 3 overrideDefaultUser:當用戶調用getConnection()時使root用戶成爲去獲取連接的用戶。主要用於連接池連接非c3p0的數據源時。Default: null overrideDefaultPassword:與overrideDefaultUser參數對應使用的一個參數。Default: null password:密碼。Default: null user:用戶名。Default: null preferredTestQuery:定義所有連接測試都執行的測試語句。在使用連接測試的情況下這個一顯著提高測試速度。注意:測試的表必須在初始數據源的時候就存在。Default: null propertyCycle:用戶修改系統配置參數執行前最多等待300秒。Defaul t: 300 testConnectionOnCheckout:因性能消耗大請只在需要的時候使用它。如果設爲true那麼在每個connection提交 的時候都將校驗其有效性。建議使用idleConnectio nTestPeriod或automaticTestTable等方法來提升連接測試的性能。Default: false testConnectionOnCheckin:如果設爲true那麼在取得連接的同時將校驗連接的有效性。Default: false |
Proxool |
acquireIncrement: 當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 fatal-sql-exception : 它是一個逗號分割的信息片段.當一個SQL異常發生時,他的異常信息將與這個信息片段進行比較.如果在片段中存在,那麼這個異常將被認爲是個致命錯誤 (Fatal SQL Exception ).這種情況下,數據庫連接將要被放棄.無論發生什麼,這個異常將會被重擲以提供給消費者.用戶最好自己配置一個不同的異常來拋出. fatal-sql-exception-wrapper-class : 正如上面所說,你最好配置一個不同的異常來重擲.利用這個屬性,用戶可以包裝SQLException,使他變成另外一個異常.這個異常或者繼承 SQLException或者繼承字RuntimeException.proxool 自帶了2個實現:'org.logicalcobwebs.proxool .FatalSQLException' 和'org.logicalcobweb s.proxool .FatalRuntimeException' .後者更合適. house-keeping-sleep-time : house keeper 保留線程處於睡眠狀態的最長時間,house keeper 的職責就是檢查各個連接的狀態,並判斷是否需要銷燬或者創建. house-keeping-test-sql : 如果發現了空閒的數據庫連接.house keeper 將會用這個語句來測試.這個語句最好非常快的被執行.如果沒有定義,測試過程將會被忽略。 injectable-connection-interface : 允許proxool 實現被代理的connection對象法. injectable-statement-interface : 允許proxool 實現被代理的Statement 對象方法. injectable-prepared-statement-interface : 允許proxool 實現被代理的PreparedS tatement 對象方法. injectable-callable-statement-interface : 允許proxool 實現被代理的CallableStat ement 對象方法. jmx : 如果屬性爲true,就會註冊一個消息Bean到jms服務,消息Bean對象名: "Proxool:type=Pool, name=<alias>". 默認值爲false. jmx-agent-id : 一個逗號分隔的JMX代理列表(如使用MbeanServerFactory .fi ndMBeanServer(String agentId)註冊的連接池。)這個屬性是僅當"jmx"屬性設置爲"true"纔有效。所有註冊jmx服務器使用這個屬性是不確定的 jndi-name : 數據源的名稱 maximum-active-time : 如果housekeeper 檢測到某個線程的活動時間大於這個數值.它將會殺掉這個線程.所以確認一下你的服務器的帶寬.然後定一個合適的值.默認是5分鐘. maximum-connection-count : 最大的數據庫連接數. maximum-connection-lifetime : 一個線程的最大壽命. minimum-connection-count : 最小的數據庫連接數 overload-without-refusal-lifetime : 這可以幫助我們確定連接池的狀態。如果我們已經拒絕了一個連接在這個設定值(毫秒),然後被認爲是超載。默認爲60秒。 prototype-count : 連接池中可用的連接數量.如果當前的連接池中的連接少於這個數值.新的連接將被建立(假設沒有超過最大可用數).例如.我們有3個活動連接2個可用連接, 而我們的prototype-count是4,那麼數據庫連接池將試圖建立另外2個連接.這和 minimum-connection-count不同. minimum-connect ion-count把活動的連接也計算在內.prototype-count 是spare connections 的數量. recently-started-threshold :這可以幫助我們確定連接池的狀態,連接數少還是多或超載。只要至少有一個連接已開始在此值(毫秒)內,或者有一些多餘的可用連接,那麼我們假設連接池是開啓的。默認爲60秒 simultaneous-build-throttle :這是我們可一次建立的最大連接數。那就是新增的連接請求,但還沒有可供使用的連接。由於連接可以使用多線程,在有限的時間之間建立聯繫從而帶來可用連 接,但是我們需要通過一些方式確認一些線程並不是立即響應連接請求的,默認是10。 statistics : 連接池使用狀況統計。 參數“10s,1m,1d” statistics-log-level :日誌統計跟蹤類型。 參數“ERROR”或 “INFO” test-before-use : 如果爲true,在每個連接被測試前都會服務這個連接,如果一個連接失敗,那麼將被丟棄,另一個連接將會被處理,如果所有連接都失敗,一個新的連接將會被建立。否則將會拋出一個SQLException異常。 test-after-use : 如果爲true,在每個連接被測試後都會服務這個連接,使其回到連接池中,如果連接失敗,那麼將被廢棄。 trace : 如果爲true,那麼每個被執行的SQL語句將會在執行期被log記錄(DEBUG LEVEL).你也可以註冊一個ConnectionListener (參看ProxoolFacade)得到這些信息 |
BoneCP |
acquireIncrement: 當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 driveClass:數據庫驅動 jdbcUrl:響應驅動的jdbcUrl username:數據庫的用戶名 password:數據庫的密碼 idleConnectionTestPeriod:檢查數據庫連接池中控線連接的間隔時間,單位是分,默認值:240,如果要取消則設置爲0 idleMaxAge:連接池中未使用的鏈接最大存活時間,單位是分,默認值:60,如果要永遠存活設置爲0 maxConnectionsPerPartition:每個分區最大的連接數 minConnectionsPerPartition:每個分區最小的連接數 partitionCount:分區數,默認值2,最小1,推薦3-4,視應用而定 acquireIncrement:每次去拿數據庫連接的時候一次性要拿幾個,默認值:2 statementsCacheSize:緩存prepared statements的大小,默認值:0 releaseHelperThreads:每個分區釋放鏈接助理進程的數量,默認值:3,除非你的一個數據庫連接的時間內做了很多工作,不然過多的助理進程會影響你的性能 其他屬性: connectionTestStatement:在做keep-alive的時候的SQL語句。 statementsCachedPerConnection:No of statements that can be cached per connection,反正源碼中不推薦使用,就別用了. initSQL:在每次到數據庫取連接的時候執行的SQL語句,只執行一次。 closeConnectionWatch:如果設置爲true,則會增加一個線程監控關閉連接時的情況,如果關閉時出現異常,則打出錯誤日誌,主要用於debug。上線後記得關掉。 logStatementsEnabled:如果設置爲true,就會打印執行的SQL語句,如果你用了其他能打印SQL語句的框架,那就不必了。 acquireRetryDelay:在獲取連接失敗後,第二次參試前的延遲時間,默認爲7000毫秒。 acquireRetryAttempts:在獲取連接失敗後的重試次數,默認爲5次。 lazyInit:如果設置爲true,那麼連接池不會自動創建最小連接數的鏈接,而是保持爲空,直到有需求要獲取連接。 transactionRecoveryEnabled:如果設置爲true,則會保存該鏈接上的所有活動,以備下次重試的時候使用,這裏指的活動是數據庫操作。 connectionHookClassName:Connection hook class name. poolName:上面特性中說到的自定義連接池名稱。 disableJMX:控制JMX的支持開關。 connectionTimeout:獲取連接的時候最大的等待時間,默認值爲:Long.MAX_VALUE |
三 性能比較
|
DBCP | C3P0 | Proxool | BoneCP |
模擬5個線程循環10次併發訪問數據庫 | 用時1181ms | 用時860ms | 用時1563ms | 用時31ms |
模擬10個線程循環10次併發訪問數據庫 | 用時1188ms | 用時953ms | 用時1625ms | 用時63ms |
模擬30個線程循環10次併發訪問數據庫 | 用時1250ms | 用時1047ms | 用時1657ms | 用時156ms |
模擬50個線程循環10次併發訪問數據庫 | 用時1406ms | 用時1343ms | 用時1843ms | 用時172ms |
模擬100個線程循環10次併發訪問數據庫 | 用時1641ms | 用時2703ms | 用時2031ms | 用時532ms |
模擬200個線程循環10次併發訪問數據庫 | 用時2093ms | 用時4891ms | 用時2406ms | 用時936ms |
模擬500個線程循環10次併發訪問數據庫 | 用時3219ms | 用時11703ms | 用時3343ms | 用時1922ms |
模擬800個線程循環10次併發訪問數據庫 | 用時4688ms | 用時12063ms | 用時4141ms | 用時2859ms |
模擬1000個線程循環10次併發訪問數據庫 | 用時5187ms | 用時12563ms | 用時4703m | 用時3610ms |
模擬3000個線程循環10次併發訪問數據庫 | 用時14094ms | 用時16297ms | 用時11344ms | 用時11391ms |
模擬5000個線程循環10次併發訪問數據庫 | 用時23610ms | 用時22032ms | 用時20125ms | 用時17125ms |