號稱史上最快數據庫連接池HikariCP

HikariCP是數據庫連接池,而且是號稱史上最快的,而且目前來看確實是這樣的,SpringBoot2.X也已經採用HikariCP作為默認連接池配置. 

使用stub-JDBC實現來隔離和測量HikariCP的開銷,在商品PC上執行了比較基準測試。

號稱史上最快數據庫連接池HikariCP

只需將其放入並讓您的代碼運行就像它的褲子一樣著火。

HikariCP為什麼這麼快


  1. 字節碼精簡:優化代碼,直到編譯後的字節碼最少,這樣,CPU緩存可以加載更多的程序代碼;
  2. 優化代理和攔截器:減少代碼,例如HikariCP的Statement proxy只有100行代碼,只有BoneCP的十分之一;
  3. 自定義數組類型(FastStatementList)代替ArrayList:避免每次get()調用都要進行range check,避免調用remove()時的從頭到尾的掃描;
  4. 自定義集合類型(ConcurrentBag):提高併發讀寫的效率;
  5. 其他針對BoneCP缺陷的優化,比如對於耗時超過一個CPU時間片的方法調用的研究(但沒說具體怎麼優化)。

幾個連接池的代碼量對比

代碼量越少,一般意味著執行效率越高、發生bug的可能性越低

號稱史上最快數據庫連接池HikariCP

優點

語句緩存

許多連接池,包括Apache DBCP,Vibur,c3p0和其他連接池都提供PreparedStatement緩存。HikariCP沒有。為什麼?

在連接池層,每個連接PreparedStatements只能緩存。如果您的應用程序有250個常用查詢和20個連接池,那麼您要求數據庫保留5000個查詢執行計劃 - 同樣,池必須緩存這麼多及其相關的對象圖。PreparedStatements

大多數主要數據庫JDBC驅動程序已經具有可以配置的Statement緩存,包括PostgreSQL,Oracle,Derby,MySQL,DB2等等。JDBC驅動程序處於利用數據庫特定功能的獨特位置,幾乎所有緩存實現都能夠跨連接共享執行計劃。這意味著,而不是內存中的5000個語句和相關的執行計劃,250個常用的查詢會在數據庫中生成250個執行計劃。聰明的實現甚至不會PreparedStatement在驅動程序級別的內存中保留 對象,而只是將新實例附加到現有的計劃ID。

在池化層使用語句緩存是一種反模式,與驅動程序提供的緩存相比,會對應用程序性能產生負面影響。

日誌語句文本/慢速查詢日誌記錄

與Statement緩存一樣,大多數主要數據庫供應商都支持通過自己的驅動程序屬性進行語句記錄 這包括Oracle,MySQL,Derby,MSSQL等。有些甚至支持慢速查詢記錄。對於那些不支持它的少數數據庫,有幾個選項可用。我們收到一份報告稱p6spy運行良好,並且還注意到log4jdbc和jdbcdslog-exp的可用性。

快速恢復

有關如何配置驅動程序和系統以從數據庫重新啟動和網絡分區事件中正確恢復的詳細信息,請閱讀快速恢復指南:https://github.com/brettwooldridge/HikariCP/wiki/Rapid-Recovery

"


分享到:


相關文章: