Hikaricp源碼解讀(1)——簡介


1、簡介

HikariCP是一款高效穩定的數據庫連接池,性能方面與其他同類產品相比能高出近10倍,尤其連接取用的設計極大的提高可靠性,對於數據庫連接中斷的情況,通過測試getConnection(),各種CP的不相同處理方法如下:
(所有CP都配置了跟connectionTimeout類似的參數為5秒鍾)

  • HikariCP:等待5秒鍾后,如果連接還是沒有恢復,則拋出一個SQLExceptions 異常;后續的getConnection()也是一樣處理;
  • C3P0:完全沒有反應,沒有提示,也不會在“CheckoutTimeout”配置的時長超時后有任何通知給調用者;然后等待2分鍾后終於醒來了,返回一個error;
  • Tomcat:返回一個connection,然后……調用者如果利用這個無效的connection執行SQL語句……結果可想而知;大約55秒之后終於醒來了,這時候的getConnection()終於可以返回一個error,但沒有等待參數配置的5秒鍾,而是立即返回error;
  • BoneCP:跟Tomcat的處理方法一樣;也是大約55秒之后才醒來,有了正常的反應,並且終於會等待5秒鍾之后返回error了;

可見,HikariCP的處理方式是最合理的。根據這個測試結果,對於各個CP處理數據庫中斷的情況,評分如下:

Pool Grade Reason
HikariCP A Properly handles connection timeouts.
Vibur B+ Properly handles connection timeouts.
Unfortunately, setUseNetworkTimeout(true) is not the default and
its importance likely missed by casual users.
Dbcp2 D Seemingly hangs until the OS TCP timeout limit.
C3P0 D Seemingly hangs until the OS TCP timeout limit.

評分結果摘自:https://github.com/brettwooldridge/HikariCP/wiki/Bad-Behavior:-Handling-Database-Down

HikariCP的優勢:

  • 字節碼精簡:優化代碼,直到編譯后的字節碼最少,這樣,CPU緩存可以加載更多的程序代碼;
  • 優化代理和攔截器:減少代碼,例如HikariCP的Statement proxy只有100行代碼,只有BoneCP的十分之一;
  • 自定義數組類型(FastList)代替ArrayList:避免每次get()調用都要進行range check,避免調用remove()時的從頭到尾的掃描;
  • 自定義集合類型(ConcurrentBag):提高並發讀寫的效率;
  • 其他針對BoneCP缺陷的優化,比如對於耗時超過一個CPU時間片的方法調用的研究

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM