HikariCP為什么這么快

HikariCP是一個高性能的JDBC連接池,基于BoneCP做了不少的改進和優(yōu)化。作者是個日本人,他還有另外一個開源作品——高性能的JSON解析器HikariJSON。

關于HikariCP的性能有多高,看圖說話:

從上述結果可以看出HikariCP的性能遠高于c3p0、tomcat等連接池,以致后來BoneCP作者都放棄了維護,在Github項目主頁推薦大家使用HikariCP。另外,Spring Boot將在2.0版本中把HikariCP作為其默認的JDBC連接池。

需要指出的是,上圖中的數據是HikariCP作者對各個連接池調用DataSource.getConnection()、Connection.close()、Connection.prepareStatement()、Statement.execute()、Statement.close()方法的性能測試結果。

JDBC連接池的實現并不復雜,主要是對JDBC中幾個核心對象Connection、Statement、PreparedStatement、CallableStatement以及ResultSet的封裝與動態(tài)代理。接下來從幾個方面來看看HikariCP為什么這么快:

1、優(yōu)化并精簡字節(jié)碼

HikariCP利用了一個第三方的Java字節(jié)碼修改類庫Javassist來生成委托實現動態(tài)代理。動態(tài)代理的實現在ProxyFactory類,源碼如下:

發(fā)現這些代理方法中只有一行直接拋異常的代碼,注釋寫著“Body is replaced (injected) by JavassistProxyFactory”,其實方法body中的代碼是在編譯時調用JavassistProxyFactory才生成的,主要代碼見下圖:

之所以使用Javassist生成動態(tài)代理,是因為其速度更快,相比于JDK Proxy生成的字節(jié)碼更少,精簡了很多不必要的字節(jié)碼。

2、ConcurrentBag:更好的并發(fā)集合類實現

ConcurrentBag的實現借鑒于C#中的同名類,是一個專門為連接池設計的lock-less集合,實現了比LinkedBlockingQueue、LinkedTransferQueue更好的并發(fā)性能。ConcurrentBag內部同時使用了ThreadLocal和CopyOnWriteArrayList來存儲元素,其中CopyOnWriteArrayList是線程共享的。ConcurrentBag采用了queue-stealing的機制獲取元素:首先嘗試從ThreadLocal中獲取屬于當前線程的元素來避免鎖競爭,如果沒有可用元素則再次從共享的CopyOnWriteArrayList中獲取,進而減少偽共享(false sharing)的發(fā)生。

3、使用FastList替代ArrayList

FastList是一個List接口的精簡實現,只實現了接口中必要的幾個方法。JDK ArrayList每次調用get()方法時都會進行rangeCheck檢查索引是否越界,FastList的實現中去除了這一檢查,只要保證索引合法那么rangeCheck就成為了不必要的計算開銷(當然開銷極小)。

此外,HikariCP使用List來保存打開的Statement,當Statement關閉或Connection關閉時需要將對應的Statement從List中移除。通常情況下,同一個Connection創(chuàng)建了多個Statement時,后打開的Statement會先關閉。ArrayList的remove(Object)方法是從頭開始遍歷數組,而FastList是從數組的尾部開始遍歷,因此更為高效。

關于HikariCP與Druid相比哪個更好?

不評論,一個追求性能,一個偏向監(jiān)控,直接看之前有人給HikariCP提的關于跟Druid對比分析的issue吧。HikariCP作者對Druid做了測試并給出了測試結果數據,Druid作者溫少也對此作了評論。Issue鏈接:https://github.com/brettwooldridge/HikariCP/issues/232

【參考】

https://github.com/brettwooldridge/HikariCP/wiki/Down-the-Rabbit-Hole

http://javatar.iteye.com/blog/814426

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容