dbcp、c3p0、proxool、Bonecp等连接池对比
突然想到了有好幾種連接池,上網(wǎng)找了下,記錄下:
DBCPDBCP是一個(gè)依賴Jakarta commons-pool對(duì)象池機(jī)制的數(shù)據(jù)庫(kù)連接池.DBCP可以直接的在應(yīng)用程序用使用http://homepages.nildram.
co.uk/~slink/java/DBPool/可以設(shè)置最大和最小連接,連接等待時(shí)間等,基本功能都有,此連接池的持續(xù)運(yùn)行的穩(wěn)定性還是可以,不過(guò)速度稍慢,在大并發(fā)量的壓力下穩(wěn)定性有所下降,此外不提供連接池監(jiān)控?C3P0?C3P0是一個(gè)開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發(fā)布,包括了實(shí)現(xiàn)jdbc3和jdbc2擴(kuò)展規(guī)范說(shuō)明的Connection 和Statement 池的DataSources 對(duì)象。?http://sourceforge.net/projects/c3p0?連接池可以設(shè)置最大和最小連接,連接等待時(shí)間等,基本功能都有,連接池的持續(xù)運(yùn)行的穩(wěn)定性相當(dāng)不錯(cuò),在大并發(fā)量的壓力下穩(wěn)定性也有一定保證,此外不提供連接池監(jiān)控。?Proxool?這是一個(gè)Java SQL Driver驅(qū)動(dòng)程序,提供了對(duì)你選擇的其它類型的驅(qū)動(dòng)程序的連接池封裝。可以非常簡(jiǎn)單的移植到現(xiàn)存的代碼中。完全可配置。快速,成熟,健壯。可以透明地為你現(xiàn)存的JDBC驅(qū)動(dòng)程序增加連接池功能。?http://sourceforge.net/projects/c3p0?連接池可以設(shè)置最大和最小連接,連接等待時(shí)間等,基本功能都有,連接池的持續(xù)運(yùn)行的穩(wěn)定性有一定問(wèn)題,有一個(gè)優(yōu)勢(shì)--連接池監(jiān)控?BoneCP?BoneCP是一個(gè)快速,開源的數(shù)據(jù)庫(kù)連接池。幫你管理數(shù)據(jù)連接讓你的應(yīng)用程序能更快速地訪問(wèn)數(shù)據(jù)庫(kù)。比C3P0/DBCP連接池快25倍?http://jolbox.com/about.html?一種新的數(shù)據(jù)連接技術(shù),以其效率高,速度快著稱,連接池可以設(shè)置最大和最小連接,連接等待時(shí)間等,基本功能都有,
??參數(shù)說(shuō)明?DBCP?dataSource: 要連接的 datasource (通常我們不會(huì)定義在 server.xml)
defaultAutoCommit: 對(duì)于事務(wù)是否 autoCommit, 默認(rèn)值為 true
defaultReadOnly: 對(duì)于數(shù)據(jù)庫(kù)是否只能讀取, 默認(rèn)值為 false
driverClassName:連接數(shù)據(jù)庫(kù)所用的 JDBC Driver Class,
maxActive: 可以從對(duì)象池中取出的對(duì)象最大個(gè)數(shù),為0則表示沒(méi)有限制,默認(rèn)為8
maxIdle: 最大等待連接中的數(shù)量,設(shè) 0 為沒(méi)有限制 (對(duì)象池中對(duì)象最大個(gè)數(shù))
minIdle:對(duì)象池中對(duì)象最小個(gè)數(shù)
maxWait: 最大等待秒數(shù), 單位為 ms, 超過(guò)時(shí)間會(huì)丟出錯(cuò)誤信息
password: 登陸數(shù)據(jù)庫(kù)所用的密碼
url: 連接數(shù)據(jù)庫(kù)的 URL
username: 登陸數(shù)據(jù)庫(kù)所用的帳號(hào)
validationQuery: 驗(yàn)證連接是否成功, SQL SELECT 指令至少要返回一行
removeAbandoned: 是否自我中斷, 默認(rèn)是 false
removeAbandonedTimeout: 幾秒后會(huì)自我中斷, removeAbandoned 必須為 true
logAbandoned: 是否記錄中斷事件, 默認(rèn)為 false
minEvictableIdleTimeMillis:大于0 ,進(jìn)行連接空閑時(shí)間判斷,或?yàn)?,對(duì)空閑的連接不進(jìn)行驗(yàn)證;默認(rèn)30分鐘
timeBetweenEvictionRunsMillis:失效檢查線程運(yùn)行時(shí)間間隔,如果小于等于0,不會(huì)啟動(dòng)檢查線程,默認(rèn)-1
testOnBorrow:取得對(duì)象時(shí)是否進(jìn)行驗(yàn)證,檢查對(duì)象是否有效,默認(rèn)為false
testOnReturn:返回對(duì)象時(shí)是否進(jìn)行驗(yàn)證,檢查對(duì)象是否有效,默認(rèn)為false
testWhileIdle:空閑時(shí)是否進(jìn)行驗(yàn)證,檢查對(duì)象是否有效,默認(rèn)為false
initialSize:初始化線程數(shù)?C3P0?acquireIncrement: 當(dāng)連接池中的連接耗盡的時(shí)候c3p0一次同時(shí)獲取的連接數(shù)。Default: 3
acquireRetryAttempts: 定義在從數(shù)據(jù)庫(kù)獲取新連接失敗后重復(fù)嘗試的次數(shù)。Default: 30
acquireRetryDelay: 兩次連接中間隔時(shí)間,單位毫秒。Default: 1000
autoCommitOnClose: 連接關(guān)閉時(shí)默認(rèn)將所有未提交的操作回滾。Defaul t: false?
automaticTestTable: c3p0將建一張名為Test的空表,并使用其自帶的查詢語(yǔ)句進(jìn)行測(cè)試。如果定義了這個(gè)參數(shù)那么屬性preferredTestQuery將被忽略。你不 能在這張Test表上進(jìn)行任何操作,它將只供c3p0測(cè)試使用。Default: null
breakAfterAcquireFailure: 獲取連接失敗將會(huì)引起所有等待連接池來(lái)獲取連接的線程拋出異常。但是數(shù)據(jù)源仍有效保留,并在下次調(diào)用getConnection()的時(shí)候繼續(xù)嘗試獲取連 接。如果設(shè)為true,那么在嘗試獲取連接失敗后該數(shù)據(jù)源將申明已斷開并永久關(guān)閉。Default: false
checkoutTimeout:當(dāng)連接池用完時(shí)客戶端調(diào)用getConnection()后等待獲取新連接的時(shí)間,超時(shí)后將拋出SQLException,如設(shè)為0則無(wú)限期等待。單位毫秒。Default: 0
connectionTesterClassName: 通過(guò)實(shí)現(xiàn)ConnectionTester或QueryConnectionT ester的類來(lái)測(cè)試連接。類名需制定全路徑。Default: com.mchange.v2.c3p0.impl.Def aultConnectionTester
factoryClassLocation: 指定c3p0 libraries的路徑,如果(通常都是這樣)在本地即可獲得那么無(wú)需設(shè)置,默認(rèn)null即可Default: null
idleConnectionTestPeriod: 每60秒檢查所有連接池中的空閑連接。Defaul t: 0
initialPoolSize: 初始化時(shí)獲取三個(gè)連接,取值應(yīng)在minPoolSize與maxPoolSize之間。Default: 3
maxIdleTime: 最大空閑時(shí)間,60秒內(nèi)未使用則連接被丟棄。若為0則永不丟棄。Default: 0
maxPoolSize: 連接池中保留的最大連接數(shù)。Default: 15
maxStatements: JDBC的標(biāo)準(zhǔn)參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedSt atements數(shù)量。但由于預(yù)緩存的statements屬于單個(gè)connection而不是整個(gè)連接池。所以設(shè)置這個(gè)參數(shù)需要考慮到多方面的因素。如 果maxStatements與maxStatementsPerConnection均為0,則緩存被關(guān)閉。Default: 0
maxStatementsPerConnection: maxStatementsPerConnection定義了連接池內(nèi)單個(gè)連接所擁有的最大緩存statements數(shù)。Default: 0
numHelperThreads:c3p0是異步操作的,緩慢的JDBC操作通過(guò)幫助進(jìn)程完成。擴(kuò)展這些操作可以有效的提升性能通過(guò)多線程實(shí)現(xiàn)多個(gè)操作同時(shí)被執(zhí)行。Default: 3
overrideDefaultUser:當(dāng)用戶調(diào)用getConnection()時(shí)使root用戶成為去獲取連接的用戶。主要用于連接池連接非c3p0的數(shù)據(jù)源時(shí)。Default: null
overrideDefaultPassword:與overrideDefaultUser參數(shù)對(duì)應(yīng)使用的一個(gè)參數(shù)。Default: null
password:密碼。Default: null
user:用戶名。Default: null
preferredTestQuery:定義所有連接測(cè)試都執(zhí)行的測(cè)試語(yǔ)句。在使用連接測(cè)試的情況下這個(gè)一顯著提高測(cè)試速度。注意:測(cè)試的表必須在初始數(shù)據(jù)源的時(shí)候就存在。Default: null
propertyCycle:用戶修改系統(tǒng)配置參數(shù)執(zhí)行前最多等待300秒。Defaul t: 300?
testConnectionOnCheckout:因性能消耗大請(qǐng)只在需要的時(shí)候使用它。如果設(shè)為true那么在每個(gè)connection提交 的時(shí)候都將校驗(yàn)其有效性。建議使用idleConnectio nTestPeriod或automaticTestTable等方法來(lái)提升連接測(cè)試的性能。Default: false?
testConnectionOnCheckin:如果設(shè)為true那么在取得連接的同時(shí)將校驗(yàn)連接的有效性。Default: false?Proxool?acquireIncrement: 當(dāng)連接池中的連接耗盡的時(shí)候c3p0一次同時(shí)獲取的連接數(shù)。Default: 3
fatal-sql-exception : 它是一個(gè)逗號(hào)分割的信息片段.當(dāng)一個(gè)SQL異常發(fā)生時(shí),他的異常信息將與這個(gè)信息片段進(jìn)行比較.如果在片段中存在,那么這個(gè)異常將被認(rèn)為是個(gè)致命錯(cuò)誤 (Fatal SQL Exception ).這種情況下,數(shù)據(jù)庫(kù)連接將要被放棄.無(wú)論發(fā)生什么,這個(gè)異常將會(huì)被重?cái)S以提供給消費(fèi)者.用戶最好自己配置一個(gè)不同的異常來(lái)拋出.
fatal-sql-exception-wrapper-class : 正如上面所說(shuō),你最好配置一個(gè)不同的異常來(lái)重?cái)S.利用這個(gè)屬性,用戶可以包裝SQLException,使他變成另外一個(gè)異常.這個(gè)異常或者繼承 SQLException或者繼承字RuntimeException.proxool 自帶了2個(gè)實(shí)現(xiàn):'org.logicalcobwebs.proxool .FatalSQLException' 和'org.logicalcobweb s.proxool .FatalRuntimeException' .后者更合適.
house-keeping-sleep-time : house keeper 保留線程處于睡眠狀態(tài)的最長(zhǎng)時(shí)間,house keeper 的職責(zé)就是檢查各個(gè)連接的狀態(tài),并判斷是否需要銷毀或者創(chuàng)建.
house-keeping-test-sql : 如果發(fā)現(xiàn)了空閑的數(shù)據(jù)庫(kù)連接.house keeper 將會(huì)用這個(gè)語(yǔ)句來(lái)測(cè)試.這個(gè)語(yǔ)句最好非常快的被執(zhí)行.如果沒(méi)有定義,測(cè)試過(guò)程將會(huì)被忽略。
injectable-connection-interface : 允許proxool 實(shí)現(xiàn)被代理的connection對(duì)象法.
injectable-statement-interface : 允許proxool 實(shí)現(xiàn)被代理的Statement 對(duì)象方法.
injectable-prepared-statement-interface : 允許proxool 實(shí)現(xiàn)被代理的PreparedS tatement 對(duì)象方法.
injectable-callable-statement-interface : 允許proxool 實(shí)現(xiàn)被代理的CallableStat ement 對(duì)象方法.
jmx : 如果屬性為true,就會(huì)注冊(cè)一個(gè)消息Bean到j(luò)ms服務(wù),消息Bean對(duì)象名: "Proxool:type=Pool, name=<alias>". 默認(rèn)值為false.
jmx-agent-id : 一個(gè)逗號(hào)分隔的JMX代理列表(如使用MbeanServerFactory .fi ndMBeanServer(String agentId)注冊(cè)的連接池。)這個(gè)屬性是僅當(dāng)"jmx"屬性設(shè)置為"true"才有效。所有注冊(cè)jmx服務(wù)器使用這個(gè)屬性是不確定的
jndi-name : 數(shù)據(jù)源的名稱
maximum-active-time : 如果housekeeper 檢測(cè)到某個(gè)線程的活動(dòng)時(shí)間大于這個(gè)數(shù)值.它將會(huì)殺掉這個(gè)線程.所以確認(rèn)一下你的服務(wù)器的帶寬.然后定一個(gè)合適的值.默認(rèn)是5分鐘.
maximum-connection-count : 最大的數(shù)據(jù)庫(kù)連接數(shù).
maximum-connection-lifetime : 一個(gè)線程的最大壽命.
minimum-connection-count : 最小的數(shù)據(jù)庫(kù)連接數(shù)
overload-without-refusal-lifetime : 這可以幫助我們確定連接池的狀態(tài)。如果我們已經(jīng)拒絕了一個(gè)連接在這個(gè)設(shè)定值(毫秒),然后被認(rèn)為是超載。默認(rèn)為60秒。
prototype-count : 連接池中可用的連接數(shù)量.如果當(dāng)前的連接池中的連接少于這個(gè)數(shù)值.新的連接將被建立(假設(shè)沒(méi)有超過(guò)最大可用數(shù)).例如.我們有3個(gè)活動(dòng)連接2個(gè)可用連接, 而我們的prototype-count是4,那么數(shù)據(jù)庫(kù)連接池將試圖建立另外2個(gè)連接.這和 minimum-connection-count不同. minimum-connect ion-count把活動(dòng)的連接也計(jì)算在內(nèi).prototype-count 是spare connections 的數(shù)量.
recently-started-threshold :這可以幫助我們確定連接池的狀態(tài),連接數(shù)少還是多或超載。只要至少有一個(gè)連接已開始在此值(毫秒)內(nèi),或者有一些多余的可用連接,那么我們假設(shè)連接池是開啟的。默認(rèn)為60秒
simultaneous-build-throttle :這是我們可一次建立的最大連接數(shù)。那就是新增的連接請(qǐng)求,但還沒(méi)有可供使用的連接。由于連接可以使用多線程,在有限的時(shí)間之間建立聯(lián)系從而帶來(lái)可用連 接,但是我們需要通過(guò)一些方式確認(rèn)一些線程并不是立即響應(yīng)連接請(qǐng)求的,默認(rèn)是10。
statistics :??連接池使用狀況統(tǒng)計(jì)。 參數(shù)“10s,1m,1d”
statistics-log-level :日志統(tǒng)計(jì)跟蹤類型。 參數(shù)“ERROR”或 “INFO”
test-before-use : 如果為true,在每個(gè)連接被測(cè)試前都會(huì)服務(wù)這個(gè)連接,如果一個(gè)連接失敗,那么將被丟棄,另一個(gè)連接將會(huì)被處理,如果所有連接都失敗,一個(gè)新的連接將會(huì)被建立。否則將會(huì)拋出一個(gè)SQLException異常。
test-after-use : 如果為true,在每個(gè)連接被測(cè)試后都會(huì)服務(wù)這個(gè)連接,使其回到連接池中,如果連接失敗,那么將被廢棄。
trace : 如果為true,那么每個(gè)被執(zhí)行的SQL語(yǔ)句將會(huì)在執(zhí)行期被log記錄(DEBUG LEVEL).你也可以注冊(cè)一個(gè)ConnectionListener (參看ProxoolFacade)得到這些信息?BoneCP?acquireIncrement: 當(dāng)連接池中的連接耗盡的時(shí)候c3p0一次同時(shí)獲取的連接數(shù)。Default: 3
driveClass:數(shù)據(jù)庫(kù)驅(qū)動(dòng)
jdbcUrl:響應(yīng)驅(qū)動(dòng)的jdbcUrl
username:數(shù)據(jù)庫(kù)的用戶名
password:數(shù)據(jù)庫(kù)的密碼
idleConnectionTestPeriod:檢查數(shù)據(jù)庫(kù)連接池中控線連接的間隔時(shí)間,單位是分,默認(rèn)值:240,如果要取消則設(shè)置為0
idleMaxAge:連接池中未使用的鏈接最大存活時(shí)間,單位是分,默認(rèn)值:60,如果要永遠(yuǎn)存活設(shè)置為0
maxConnectionsPerPartition:每個(gè)分區(qū)最大的連接數(shù)
minConnectionsPerPartition:每個(gè)分區(qū)最小的連接數(shù)
partitionCount:分區(qū)數(shù),默認(rèn)值2,最小1,推薦3-4,視應(yīng)用而定
acquireIncrement:每次去拿數(shù)據(jù)庫(kù)連接的時(shí)候一次性要拿幾個(gè),默認(rèn)值:2
statementsCacheSize:緩存prepared statements的大小,默認(rèn)值:0
releaseHelperThreads:每個(gè)分區(qū)釋放鏈接助理進(jìn)程的數(shù)量,默認(rèn)值:3,除非你的一個(gè)數(shù)據(jù)庫(kù)連接的時(shí)間內(nèi)做了很多工作,不然過(guò)多的助理進(jìn)程會(huì)影響你的性能
性能比較:
?????
?DBCP?C3P0?Proxool?BoneCP模擬5個(gè)線程循環(huán)10次并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)?用時(shí)1181ms?用時(shí)860ms?用時(shí)1563ms?用時(shí)31ms模擬10個(gè)線程循環(huán)10次并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)?用時(shí)1188ms?用時(shí)953ms?用時(shí)1625ms?用時(shí)63ms模擬30個(gè)線程循環(huán)10次并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)?用時(shí)1250ms?用時(shí)1047ms?用時(shí)1657ms?用時(shí)156ms模擬50個(gè)線程循環(huán)10次并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)?用時(shí)1406ms?用時(shí)1343ms?用時(shí)1843ms?用時(shí)172ms模擬100個(gè)線程循環(huán)10次并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)?用時(shí)1641ms?用時(shí)2703ms?用時(shí)2031ms?用時(shí)532ms
模擬200個(gè)線程循環(huán)10次并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)?用時(shí)2093ms?用時(shí)4891ms?用時(shí)2406ms?用時(shí)936ms模擬500個(gè)線程循環(huán)10次并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)用時(shí)3219ms用時(shí)11703ms用時(shí)3343ms用時(shí)1922ms模擬800個(gè)線程循環(huán)10次并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)用時(shí)4688ms用時(shí)12063ms用時(shí)4141ms用時(shí)2859ms模擬1000個(gè)線程循環(huán)10次并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)用時(shí)5187ms用時(shí)12563ms用時(shí)4703m用時(shí)3610ms模擬3000個(gè)線程循環(huán)10次并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)用時(shí)14094ms用時(shí)16297ms用時(shí)11344ms用時(shí)11391ms模擬5000個(gè)線程循環(huán)10次并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)用時(shí)23610ms用時(shí)22032ms用時(shí)20125ms用時(shí)17125ms
總結(jié)
以上是生活随笔為你收集整理的dbcp、c3p0、proxool、Bonecp等连接池对比的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 死锁解决(oracle)
- 下一篇: oracle取得序列当前值(不改变当前序