HikariCP是一個高性能的JDBC連接池,基于BoneCP做了不少的改進和優(yōu)化嘹悼。作者是個日本人,他還有另外一個開源作品——高性能的JSON解析器HikariJSON合溺。
關于HikariCP的性能有多高缀台,看圖說話:
從上述結(jié)果可以看出HikariCP的性能遠高于c3p0膛腐、tomcat等連接池,以致后來BoneCP作者都放棄了維護辩涝,在Github項目主頁推薦大家使用HikariCP勘天。另外,Spring Boot將在2.0版本中把HikariCP作為其默認的JDBC連接池商膊。
需要指出的是宠进,上圖中的數(shù)據(jù)是HikariCP作者對各個連接池調(diào)用DataSource.getConnection()、Connection.close()实幕、Connection.prepareStatement()堤器、Statement.execute()、Statement.close()方法的性能測試結(jié)果整吆。
JDBC連接池的實現(xiàn)并不復雜圈暗,主要是對JDBC中幾個核心對象Connection、Statement、PreparedStatement寸齐、CallableStatement以及ResultSet的封裝與動態(tài)代理。接下來從幾個方面來看看HikariCP為什么這么快:
1扰法、優(yōu)化并精簡字節(jié)碼
HikariCP利用了一個第三方的Java字節(jié)碼修改類庫Javassist來生成委托實現(xiàn)動態(tài)代理毅厚。動態(tài)代理的實現(xiàn)在ProxyFactory類,源碼如下:
發(fā)現(xiàn)這些代理方法中只有一行直接拋異常的代碼祠锣,注釋寫著“Body is replaced (injected) by JavassistProxyFactory”咽安,其實方法body中的代碼是在編譯時調(diào)用JavassistProxyFactory才生成的妆棒,主要代碼見下圖:
之所以使用Javassist生成動態(tài)代理糕珊,是因為其速度更快,相比于JDK Proxy生成的字節(jié)碼更少刺啦,精簡了很多不必要的字節(jié)碼纠脾。
2、ConcurrentBag:更好的并發(fā)集合類實現(xiàn)
ConcurrentBag的實現(xiàn)借鑒于C#中的同名類糊渊,是一個專門為連接池設計的lock-less集合慧脱,實現(xiàn)了比LinkedBlockingQueue、LinkedTransferQueue更好的并發(fā)性能宗兼。ConcurrentBag內(nèi)部同時使用了ThreadLocal和CopyOnWriteArrayList來存儲元素氮采,其中CopyOnWriteArrayList是線程共享的。ConcurrentBag采用了queue-stealing的機制獲取元素:首先嘗試從ThreadLocal中獲取屬于當前線程的元素來避免鎖競爭主到,如果沒有可用元素則再次從共享的CopyOnWriteArrayList中獲取,進而減少偽共享(false sharing)的發(fā)生畔师。
3牧牢、使用FastList替代ArrayList
FastList是一個List接口的精簡實現(xiàn),只實現(xiàn)了接口中必要的幾個方法伯铣。JDK ArrayList每次調(diào)用get()方法時都會進行rangeCheck檢查索引是否越界献幔,F(xiàn)astList的實現(xiàn)中去除了這一檢查,只要保證索引合法那么rangeCheck就成為了不必要的計算開銷(當然開銷極小)蹬蚁。
此外郑兴,HikariCP使用List來保存打開的Statement,當Statement關閉或Connection關閉時需要將對應的Statement從List中移除叽粹。通常情況下却舀,同一個Connection創(chuàng)建了多個Statement時挽拔,后打開的Statement會先關閉。ArrayList的remove(Object)方法是從頭開始遍歷數(shù)組螃诅,而FastList是從數(shù)組的尾部開始遍歷术裸,因此更為高效。
關于HikariCP與Druid相比哪個更好搀崭?
不評論匹表,一個追求性能宣鄙,一個偏向監(jiān)控默蚌,直接看之前有人給HikariCP提的關于跟Druid對比分析的issue吧绸吸。HikariCP作者對Druid做了測試并給出了測試結(jié)果數(shù)據(jù)设江,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