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時間片的方法調用的研究