Hikaricp原始碼解讀(1)——簡介
阿新 • • 發佈:2019-01-28
1、簡介
HikariCP是一款高效穩定的資料庫連線池,效能方面與其他同類產品相比能高出近10倍,尤其連線取用的設計極大的提高可靠性,對於資料庫連線中斷的情況,通過測試getConnection(),各種CP的不相同處理方法如下:
(所有CP都配置了跟connectionTimeout類似的引數為5秒鐘)
- HikariCP:等待5秒鐘後,如果連線還是沒有恢復,則丟擲一個SQLExceptions 異常;後續的getConnection()也是一樣處理;
- C3P0:完全沒有反應,沒有提示,也不會在“CheckoutTimeout”配置的時長超時後有任何通知給呼叫者;然後等待2分鐘後終於醒來了,返回一個error;
- Tomcat
- 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. |
HikariCP的優勢:
- 位元組碼精簡:優化程式碼,直到編譯後的位元組碼最少,這樣,CPU快取可以載入更多的程式程式碼;
- 優化代理和攔截器:減少程式碼,例如HikariCP的Statement proxy只有100行程式碼,只有BoneCP的十分之一;
- 自定義陣列型別(FastList)代替ArrayList:避免每次get()呼叫都要進行range check,避免呼叫remove()時的從頭到尾的掃描;
- 自定義集合型別(ConcurrentBag):提高併發讀寫的效率;
- 其他針對BoneCP缺陷的優化,比如對於耗時超過一個CPU時間片的方法呼叫的研究