号称史上最快数据库连接池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

"


分享到:


相關文章: