HikariCP為什么這么快

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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末码俩,一起剝皮案震驚了整個濱河市稿存,隨后出現(xiàn)的幾起案子瞳秽,更是在濱河造成了極大的恐慌,老刑警劉巖袖迎,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燕锥,死亡現(xiàn)場離奇詭異悯蝉,居然都是意外死亡,警方通過查閱死者的電腦和手機连霉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門跺撼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讨彼,“玉大人,你說我怎么就攤上這事哩至。” “怎么了卢佣?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵箭阶,是天一觀的道長。 經(jīng)常有香客問我嘹叫,道長诈乒,這世上最難降的妖魔是什么怕磨? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮仰泻,結(jié)果婚禮上滩届,老公的妹妹穿的比我還像新娘帜消。我一直安慰自己,他們只是感情好泡挺,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布娄猫。 她就那樣靜靜地躺著贱除,像睡著了一般。 火紅的嫁衣襯著肌膚如雪媳溺。 梳的紋絲不亂的頭發(fā)上月幌,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音悬蔽,去河邊找鬼扯躺。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的录语。 我是一名探鬼主播倍啥,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼澎埠!你這毒婦竟也來了虽缕?” 一聲冷哼從身側(cè)響起失暂,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤彼宠,失蹤者是張志新(化名)和其女友劉穎鳄虱,沒想到半個月后弟塞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡拙已,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年决记,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倍踪。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡系宫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出建车,到底是詐尸還是另有隱情扩借,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布缤至,位于F島的核電站潮罪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏领斥。R本人自食惡果不足惜嫉到,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望月洛。 院中可真熱鬧何恶,春花似錦、人聲如沸嚼黔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唬涧。三九已至疫赎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爵卒,已是汗流浹背虚缎。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人实牡。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓陌僵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親创坞。 傳聞我的和親對象是個殘疾皇子碗短,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容