本文主要是對(duì)這hikariCP,druid,tomcat-jdbc,dbcp,c3p0幾種連接池的詳細(xì)的功能和性能測(cè)試對(duì)比,通過(guò)這次測(cè)試對(duì)目前主流的一些連接池做一個(gè)全面的對(duì)比,從而給業(yè)務(wù)系統(tǒng)一個(gè)最佳的推薦。
測(cè)試結(jié)論
1滑频、性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 猴鲫。hikariCP的高性能得益于最大限度的避免鎖競(jìng)爭(zhēng)瘟斜。
2翁垂、druid功能最為全面莽使,sql攔截等功能绵跷,統(tǒng)計(jì)數(shù)據(jù)較為全面膘螟,具有良好的擴(kuò)展性。
3碾局、綜合考慮到目前venus已經(jīng)支持druid且hikariCP并未發(fā)現(xiàn)有太多大規(guī)模的生產(chǎn)實(shí)踐的案例荆残,后續(xù)將推薦使用druid并把codegen生成的代碼默認(rèn)連接池為druid。
4净当、可開啟prepareStatement緩存内斯,對(duì)性能會(huì)有大概10%的提升。
功能對(duì)比
線程的作用
1像啼、dbcp:一個(gè)線程:負(fù)責(zé)心跳猖闪,最小連接數(shù)維持肠缔,最大空閑時(shí)間和防連接泄露。
2、druid: 兩個(gè)線程: 其中一個(gè)負(fù)責(zé)異步創(chuàng)建祥诽。一個(gè)負(fù)責(zé)最小連接數(shù)的維持。 其中心跳是通過(guò)獲取連接,來(lái)判定是否小于心跳間隔。
3蝗碎、hikariCP: 三個(gè)線程: 其中一個(gè)為定時(shí)線程,解決最大空閑時(shí)間旗扑。兩個(gè)為新建連接和關(guān)閉連接蹦骑。 均是連接池,空閑5s臀防,線程便會(huì)關(guān)閉脊串。
4、c3p0: 四個(gè)線程清钥;三個(gè)helperThread (pollerThread),一個(gè)定時(shí)AdminTaskTimer(DeadlockDetector)琼锋。
由于boneCP被hikariCP替代,并且已經(jīng)不再更新祟昭,boneCP沒有進(jìn)行調(diào)研缕坎。
proxool網(wǎng)上有評(píng)測(cè)說(shuō)在并發(fā)較高的情況下會(huì)出錯(cuò),proxool便沒有進(jìn)行調(diào)研篡悟。
druid的功能比較全面谜叹,且擴(kuò)展性較好,比較方便對(duì)jdbc接口進(jìn)行監(jiān)控跟蹤等搬葬。
c3p0歷史悠久荷腊,代碼及其復(fù)雜,不利于維護(hù)急凰。并且存在deadlock的潛在風(fēng)險(xiǎn)女仰。
國(guó)內(nèi)公司連接池使用情況
性能測(cè)試(網(wǎng)上查證的,沒有親測(cè))
1抡锈、環(huán)境配置:
2疾忍、獲取關(guān)閉連接性能測(cè)試
測(cè)試說(shuō)明如下:
初始連接和最小連接均為5,最大連接為20床三。在borrow和return均不心跳檢測(cè)
其中打開關(guān)閉次數(shù)為: 100w次
測(cè)試用例和mysql在同一臺(tái)機(jī)器上面一罩,盡量避免io的影響
使用mock和連接mysql在不同線程并發(fā)下的響應(yīng)時(shí)間
mock性能數(shù)據(jù) (單位:ms):
3、mysql性能數(shù)據(jù) (單位:ms)
測(cè)試結(jié)果:
1撇簿、mock和mysql連接性能表現(xiàn)差不多聂渊,主要是由于初始化的時(shí)候建立了連接后期不再建立連接,和使用mock連接邏輯一致四瘫。
2汉嗽、性能表現(xiàn):hikariCP>druid>tomcat-jdbc>dbcp>c3p0。
3莲组、hikariCP 的性能及其優(yōu)異诊胞。hikariCP號(hào)稱java平臺(tái)最快的數(shù)據(jù)庫(kù)連接池。
4、hikariCP在并發(fā)較高的情況下撵孤,性能基本上沒有下降迈着。
5、c3p0連接池的性能很差邪码,不建議使用該數(shù)據(jù)庫(kù)連接池裕菠。
hikariCP性能分析:
1、hikariCP通過(guò)優(yōu)化(concurrentBag闭专,fastStatementList )集合來(lái)提高并發(fā)的讀寫效率奴潘。
2、hikariCP使用threadlocal緩存連接及大量使用CAS的機(jī)制影钉,最大限度的避免lock画髓。單可能帶來(lái)cpu使用率的上升。
3平委、從字節(jié)碼的維度優(yōu)化代碼奈虾。 (default inline threshold for a JVM running the server Hotspot compiler is 35 bytecodes )讓方法盡量在35個(gè)字節(jié)碼一下,來(lái)提升jvm的處理效率廉赔。
查詢一條語(yǔ)句性能測(cè)試
測(cè)試說(shuō)明:
初始連接和最小連接均為8肉微,最大連接為8。在borrow和return均不心跳檢測(cè)
測(cè)試在不同并發(fā)下查詢的次數(shù)為10w次的總耗時(shí)對(duì)比蜡塌,操作步驟為 1:打開連接 2:執(zhí)行 :select 3. 關(guān)閉連接
測(cè)試用例和mysql在同一臺(tái)機(jī)器上面碉纳,盡量避免io的影響
測(cè)試數(shù)據(jù):
連接池5ms8ms20ms50ms100ms
tomcat-jdbc2,1781,4951,7691,8181,858
c3p03,2373,4514,4885,9947,906
dbcp2,8161,9352,0972,2432,280
hikari2,2991,5461,6821,7511,772
druid2,2971,5511,8001,9772,032
測(cè)試結(jié)果:
在并發(fā)比較少的情況下,每個(gè)連接池的響應(yīng)時(shí)間差不多馏艾。是由于并發(fā)少劳曹,基本上沒有資源競(jìng)爭(zhēng)。
在并發(fā)較高的情況下攒至,隨著并發(fā)的升高厚者,hikariCP響應(yīng)時(shí)間基本上沒有變動(dòng)躁劣。
c3p0隨著并發(fā)的提高迫吐,性能急劇下降。
pscache性能對(duì)比
測(cè)試說(shuō)明:
通過(guò)druid進(jìn)行設(shè)置pscache和不設(shè)置pscache的性能對(duì)比
初始連接和最小連接均為8账忘,最大連接為8志膀。在borrow和return均不心跳檢測(cè)。并且執(zhí)行的并發(fā)數(shù)為8.
查詢10w次鳖擒。查詢流程為:1:建立連接溉浙,2:循環(huán)查詢preparestatement語(yǔ)句 3:close連接
測(cè)試用例和mysql在同一臺(tái)機(jī)器上面,盡量避免io的影響
測(cè)試數(shù)據(jù):
cache1,927
not cache2,134
測(cè)試結(jié)果:
開啟psCache緩存,性能大概有10%幅度的提升蒋荚〈粱可考慮開啟pscache.
測(cè)試說(shuō)明:
psCache是connection私有的,所以不存在線程競(jìng)爭(zhēng)的問(wèn)題,開啟pscache不會(huì)存在競(jìng)爭(zhēng)的性能損耗惊奇。
psCache的key為prepare執(zhí)行的sql和catalog等互躬,value對(duì)應(yīng)的為prepareStatement對(duì)象。開啟緩存主要是減少了解析sql的開銷颂郎。