數據庫連性池性能測試(hikariCP,druid,tomcat-jdbc,dbcp,c3p0)

原文地址

摘要: 本文主要是對這hikariCP,druid,tomcat-jdbc,dbcp,c3p0幾種連接池的詳細的功能和性能測試對比,通過這次測試對目前主流的一些連接池做一個全面的對比,從而給業務系統一個最佳的推薦。而唯品會venus-data支持三種連接池DBCP、C3P0、DRUID,其中C3P0作爲默認的連接池。因此需要針對現狀,研發一種分佈式數據庫連接池。

測試結論

  1. 性能方面 hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益於最大限度的避免鎖競爭。
  2. druid功能最爲全面,sql攔截等功能,統計數據較爲全面,具有良好的擴展性。
  3. 綜合考慮到目前venus已經支持druid且hikariCP並未發現有太多大規模的生產實踐的案例,後續將推薦使用druid並把codegen生成的代碼默認連接池爲druid。
  4. 可開啓prepareStatement緩存,對性能會有大概10%的提升。

功能對比

功能dbcpdruidc3p0tomcat-jdbcHikariCP
是否支持PSCache
監控jmxjmx/log/httpjmx,logjmxjmx
擴展性
sql攔截及解析支持
代碼簡單中等複雜簡單簡單
更新時間2015.8.62015.10.102015.12.09 2015.12.3
特點依賴於common-pool阿里開源,功能全面歷史久遠,代碼邏輯複雜,且不易維護 優化力度大,功能簡單,起源於boneCP
連接池管理LinkedBlockingDeque數組 FairBlockingQueuethreadlocal+CopyOnWriteArrayList
線程1個線程(心跳)2個線程4個 3個

線程的作用

  1. dbcp:一個線程:負責心跳,最小連接數維持,最大空閒時間和防連接泄露。
  2. druid: 兩個線程: 其中一個負責異步創建。一個負責最小連接數的維持。 其中心跳是通過獲取連接,來判定是否小於心跳間隔。
  3. hikariCP: 三個線程: 其中一個爲定時線程,解決最大空閒時間。兩個爲新建連接和關閉連接。 均是連接池,空閒5s,線程便會關閉。
  4. c3p0: 四個線程;三個helperThread (pollerThread),一個定時AdminTaskTimer(DeadlockDetector)。 
    由於boneCP被hikariCP替代,並且已經不再更新,boneCP沒有進行調研。 
    proxool網上有評測說在併發較高的情況下會出錯,proxool便沒有進行調研。 
    druid的功能比較全面,且擴展性較好,比較方便對jdbc接口進行監控跟蹤等。 
    c3p0歷史悠久,代碼及其複雜,不利於維護。並且存在deadlock的潛在風險。

國內公司連接池使用情況

公司數據庫連接池
58同城自己開發
滴滴druid dbcp
知果果druid
慧聰druid dbcp
起步科技dbcp 和 druid
亞信hikariCP
唯品會dbcp,druid,c3p0(默認)

性能測試

環境配置:

CPUIntel(R) Xeon(R) CPU E5-2430 v2 @ 2.50GHz,24core
msyql version5.5.46
tomcat-jdbc version8.0.28
HikariCP version2.4.3
c3p0 Version0.9.5-pre8
dbcpVersion2.0.1
druidVersion1.0.5

獲取關閉連接性能測試

測試說明如下:

  • 初始連接和最小連接均爲5,最大連接爲20。在borrow和return均不心跳檢測

  • 其中打開關閉次數爲: 100w次

  • 測試用例和mysql在同一臺機器上面,儘量避免io的影響

  • 使用mock和連接mysql在不同線程併發下的響應時間

mock性能數據 (單位:ms)

連接池5ms20ms50ms100ms
tomcat-jdbc4424471,0131,264
c3p04,4805,5277,44910,725
dbcp6766898671,292
hikari38333830
druid291293562985

mysql性能數據 (單位:ms)

連接池5ms20ms50ms100ms
tomcat-jdbc4364531,0331,291
c3p04,3785,7267,97510,948
dbcp6716798971,380
hikari96828778
druid3044246901,130

測試結果:

  • mock和mysql連接性能表現差不多,主要是由於初始化的時候建立了連接後期不再建立連接,和使用mock連接邏輯一致。
  • 性能表現:hikariCP>druid>tomcat-jdbc>dbcp>c3p0。
  • hikariCP 的性能及其優異。hikariCP號稱java平臺最快的數據庫連接池。
  • hikariCP在併發較高的情況下,性能基本上沒有下降。
  • c3p0連接池的性能很差,不建議使用該數據庫連接池。

hikariCP性能分析:

  • hikariCP通過優化(concurrentBag,fastStatementList )集合來提高併發的讀寫效率。
  • hikariCP使用threadlocal緩存連接及大量使用CAS的機制,最大限度的避免lock。單可能帶來cpu使用率的上升。
  • 從字節碼的維度優化代碼。 (default inline threshold for a JVM running the server Hotspot compiler is 35 bytecodes )讓方法儘量在35個字節碼一下,來提升jvm的處理效率。

查詢一條語句性能測試

測試說明:

  • 初始連接和最小連接均爲8,最大連接爲8。在borrow和return均不心跳檢測
  • 測試在不同併發下查詢的次數爲10w次的總耗時對比,操作步驟爲 1:打開連接 2:執行 :select 3. 關閉連接
  • 測試用例和mysql在同一臺機器上面,儘量避免io的影響

測試數據:

連接池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

測試結果:

  • 在併發比較少的情況下,每個連接池的響應時間差不多。是由於併發少,基本上沒有資源競爭。
  • 在併發較高的情況下,隨着併發的升高,hikariCP響應時間基本上沒有變動。
  • c3p0隨着併發的提高,性能急劇下降。

pscache性能對比

測試說明:

  • 通過druid進行設置pscache和不設置pscache的性能對比
  • 初始連接和最小連接均爲8,最大連接爲8。在borrow和return均不心跳檢測。並且執行的併發數爲8.
  • 查詢10w次。查詢流程爲:1:建立連接,2:循環查詢preparestatement語句 3:close連接
  • 測試用例和mysql在同一臺機器上面,儘量避免io的影響

測試數據:

cache1,927
not cache2,134

測試結果:

  • 開啓psCache緩存,性能大概有10%幅度的提升。可考慮開啓pscache.

測試說明:

  • psCache是connection私有的,所以不存在線程競爭的問題,開啓pscache不會存在競爭的性能損耗。
  • psCache的key爲prepare執行的sql和catalog等,value對應的爲prepareStatement對象。開啓緩存主要是減少了解析sql的開銷。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章