Hikaricp和Druid对比
创始人
2025-05-28 15:58:57

1、版本

  • mysql版本:8.0.27

  • HikariCP版本:3.2.0

  • Druid版本:1.1.9

2、对比结果

3、详细对比

1、获取和关闭连接速度对比

HikariCP的作者的brettwooldridge给出的获取Connection和获取Statement性能对比。(没有找到对应的配置)

本地测试时,为了减少网络IO对测试结果的影响,数据库使用本地的mysql。两个连接池保持同样的配置:初始化连接数量10,最大连接数量20。

1、获取和关闭连接池

获取和关闭连接池时随着线程数量的上升,druid ops上升越来越慢。

原始数据:

TestHikariCP.openAndClose1 thrpt 10 14084.597 ± 263.273 ops/ms

TestHikariCP.openAndClose2 thrpt 10 26669.662 ± 1979.910 ops/ms

TestHikariCP.openAndClose4 thrpt 10 54955.198 ± 533.937 ops/ms

TestHikariCP.openAndClose8 thrpt 10 98677.275 ± 6270.774 ops/ms

TestHikariCP.openAndClose16 thrpt 10 176690.562 ± 6083.721 ops/ms

TestDruid.openAndClose1 thrpt 10 8101.615 ± 126.243 ops/ms

TestDruid.openAndClose2 thrpt 10 15588.456 ± 252.512 ops/ms

TestDruid.openAndClose4 thrpt 10 27153.827 ± 381.426 ops/ms

TestDruid.openAndClose8 thrpt 10 49823.081 ± 5481.129 ops/ms

TestDruid.openAndClose16 thrpt 10 83694.785 ± 12806.862 ops/ms

2、获取和关闭Statement

获取Statement时候,hikaricp略强于druid,但是并没有明显的差距。

原始数据:

TestHikariCP.openAndClose thrpt 10 3245.305 ± 39.683 ops/ms

TestHikariCP.openAndClose2 thrpt 10 5941.554 ± 100.023 ops/ms

TestHikariCP.openAndClose4 thrpt 10 9402.591 ± 125.380 ops/ms

TestHikariCP.openAndClose8 thrpt 10 13509.174 ± 216.521 ops/ms

TestHikariCP.openAndClose16 thrpt 10 24027.376 ± 971.336 ops/ms

TestDruid.openAndClose1 thrpt 10 3171.887 ± 73.370 ops/ms

TestDruid.openAndClose2 thrpt 10 5664.910 ± 137.471 ops/ms

TestDruid.openAndClose4 thrpt 10 8139.116 ± 205.789 ops/ms

TestDruid.openAndClose8 thrpt 10 13538.226 ± 68.399 ops/ms

TestDruid.openAndClose16 thrpt 10 22007.958 ± 1059.670 ops/ms

2、PScache

#druid支持PScache,配置如下:
poolPreparedStatements=true
maxOpenPreparedStatements=20

HikariCP不支持PScache,作者认为缓存Statement需要存储大量对象,并且PostgreSQL, Oracle, Derby, MySQL, DB2以及其他很多数据库的JDBC驱动都有实现PScache,在连接池上重复实现是不获益的,并且可能存在负面的影响。

3、代码量对比

4、监控功能对比

Druid

开启页面监控

springboot使用druid监控可以通过在配置文件中配置StatFilter开启

# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
spring.datasource.druid.web-stat-filter.enabled= #是否启用StatFilter默认值false
spring.datasource.druid.web-stat-filter.url-pattern=
spring.datasource.druid.web-stat-filter.exclusions=
spring.datasource.druid.web-stat-filter.session-stat-enable=
spring.datasource.druid.web-stat-filter.session-stat-max-count=
spring.datasource.druid.web-stat-filter.principal-session-name=
spring.datasource.druid.web-stat-filter.principal-cookie-name=
spring.datasource.druid.web-stat-filter.profile-enable=# StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
spring.datasource.druid.stat-view-servlet.enabled= #是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
spring.datasource.druid.stat-view-servlet.url-pattern=
spring.datasource.druid.stat-view-servlet.reset-enable=
spring.datasource.druid.stat-view-servlet.login-username=
spring.datasource.druid.stat-view-servlet.login-password=
spring.datasource.druid.stat-view-servlet.allow=
spring.datasource.druid.stat-view-servlet.deny=

或者可以通过注入Bean的方式来开启监控

    @Beanpublic ServletRegistrationBean statViewServlet() {ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");//设置ip白名单servletRegistrationBean.addInitParameter("allow", "");//设置ip黑名单,优先级高于白名单servletRegistrationBean.addInitParameter("deny", "");//设置控制台管理用户servletRegistrationBean.addInitParameter("loginUsername", "root");servletRegistrationBean.addInitParameter("loginPassword", "root");//是否可以重置数据servletRegistrationBean.addInitParameter("resetEnable", "false");return servletRegistrationBean;}@Beanpublic FilterRegistrationBean statFilter() {//创建过滤器FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());//设置过滤器过滤路径filterRegistrationBean.addUrlPatterns("/*");//忽略过滤的形式filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return filterRegistrationBean;}

HikariCP

Metrics

HikariCP从2.2.0版本以后支持Metrics,收集了Wait(获取连接耗时信息),Usage(使用连接时间信息),TotalConnections(总连接数),IdleConnections(空闲连接数),ActiveConnections(活跃连接数),PendingConnections(等待连接数)等指标,需要调用HikariConfig或者HikariDataSource来开启使用。

    @Beanpublic DataSource dataSource() {Properties dsProps = new Properties();dsProps.setProperty("jdbcUrl", url);dsProps.setProperty("username", username);dsProps.setProperty("password", password);dsProps.setProperty("driverClassName", driverClassName);HikariConfig config = new HikariConfig(dsProps);MetricRegistry metricRegistry = new MetricRegistry();config.setMetricRegistry(metricRegistry);Slf4jReporter reporter = Slf4jReporter.forRegistry(metricRegistry).build();reporter.start(1, TimeUnit.MINUTES);return new HikariDataSource(config);}

同时wiki(https://github.com/brettwooldridge/HikariCP/wiki/Dropwizard-Metrics)里给出了各个指标的含义:

实际的效果如下:

Jmx

HikariCP还可以通过JMX获取监控Active,Idle,Wait,Total等指标,配置如下:

@Bean
public DataSource dataSource() throws MalformedObjectNameException {HikariDataSource hikaridatasource = new HikariDataSource();hikaridatasource.setJdbcUrl(url);hikaridatasource.setUsername(username);hikaridatasource.setPassword(password);hikaridatasource.setRegisterMbeans(true);hikaridatasource.setPoolName("HikariConnectionPool");MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();ObjectName poolName = new ObjectName("com.zaxxer.hikari:type=Pool (" + hikaridatasource.getPoolName() + ")");hikariPoolMXBean = JMX.newMXBeanProxy(mBeanServer, poolName, HikariPoolMXBean.class);return hikaridatasource;
}

通过调用HikariPoolMXBean中对应方法可以获取到连接池监控指标。

4、结论

性能方面:HikariCP因为细节方面优化力度较大,性能方面强于Druid

功能丰富程度方面:Druid功能更全面除了具有连接池的基本功能以外,还支持sql级监控,支持扩展,防止SQL注入等功能。

使用热度:Druid在国内使用较多,国内有很多生产实践。HikariCP是spring boot 2.0以后默认连接池,在国外使用较多。

相关内容

热门资讯

Vault配置中心产品调研实施... Vault配置中心产品调研实施方案 一、需求描述 nacos作为配置中文,数据都是明文...
镜头校正软件的新标杆DxO P... 镜头校正软件的新标杆DxO PhotoLab 6 的光学校正功能基于 DxO 专用实验室 20 年的...
CNI 网络流量 5.2 Ci... 文章目录Pod 间同节点 pod跨节点 pod in vxlan小结 环境: fedo...
汽车养护,汽车养护品牌排行榜前... 今天给各位分享汽车养护,汽车养护品牌排行榜前十名的知识,其中也会对汽车养护产品品牌进行解释,如果能碰...
大灯随动转向是什么意思?随动转... 今天给各位分享大灯随动转向是什么意思?随动转向大灯是什么功能的知识,其中也会对大灯随动转向是近光还是...
80厘米是几尺几寸(78厘米是... 本篇文章极速百科给大家谈谈80厘米是几尺几寸,以及78厘米是几尺几寸对应的知识点,希望对各位有所帮助...
拉杆旅行箱包十大品牌排行(拉杆... 今天给各位分享拉杆旅行箱包十大品牌排行的知识,其中也会对拉杆旅行包价格进行解释,如果能碰巧解决你现在...
Vue2学习小笔记(一篇带你入... 一篇入门Vue2一、基础概念1.1 MVC和MVVM1.2 初识Vue1.2.1 Vue是什么1.2...
【3.17】MySQL索引整理... 3.1 索引常见面试题 索引的分类 什么是索引? 索引是一种数据结构,...
ASEMI代理PCF85163... 编辑:ll ASEMI代理PCF85163T/1,518原装NXP车规级PCF8516...
83、NeRFshop: In... 简介 主页:https://repo-sam.inria.fr/fungraph/ne...
车辆违章查询电话是多少(车辆违... 本篇文章极速百科给大家谈谈车辆违章查询电话是多少,以及车辆违章查询客服电话是多少对应的知识点,希望对...
5寸照片是多大尺寸(5寸照片是... 本篇文章极速百科给大家谈谈5寸照片是多大尺寸,以及5寸照片是多大尺寸的对应的知识点,希望对各位有所帮...
日产精品卡2卡3卡4卡怎么看(... 今天给各位分享日产精品卡2卡3卡4卡怎么看的知识,其中也会对日产sim卡进行解释,如果能碰巧解决你现...
上海通用所有车标,上海通用汽车... 今天给各位分享上海通用所有车标,上海通用汽车有几种标志的知识,其中也会对上海通用汽车的车标进行解释,...
数据挖掘与分析应用刷题笔记2 数据挖掘与分析应用刷题笔记2 2022找工作是学历、能力和运气的超强结合体,遇到寒冬&...
雷克萨斯gx怎么样(2020款... 今天给各位分享雷克萨斯gx怎么样的知识,其中也会对2020款雷克萨斯gx进行解释,如果能碰巧解决你现...
国内4大豪车俱乐部,个个都是豪... 今天给各位分享国内4大豪车俱乐部,个个都是豪车一堆,令人眼花缭乱的知识,其中也会对豪车俱乐部是什么意...
自驾游海边哪里好玩?自驾游去浙... 今天给各位分享自驾游海边哪里好玩?自驾游去浙江海边哪好玩?的知识,其中也会对浙江去海边玩去哪里进行解...
2023北京限号轮换图,202... 本篇文章极速百科给大家谈谈2023北京限号轮换图,2023年北京新一轮限号,以及21年3月北京限号对...
vi 编辑命令 命令Summary: movement keysHere's a recap of the move...
(十六)qt creator中... 文章目录1.Qt使用qmake的工程添加OpenCV库2.Debug时常见问题 欢迎访问个人网络日...
X99主板2011-3接口E5... 最近发现精粤出了好多X99的主板,博主从intel 网站整理了X99主板2011-3接...
工信部认可老年代步车目录,十大... 本篇文章极速百科给大家谈谈工信部认可老年代步车目录,十大名牌老年代步电动四轮...,以及国家工信部公...
XNV为什么不挂本田logo?... 今天给各位分享XNV为什么不挂本田logo?东风本田XNV优缺点有哪些的知识,其中也会对东风本田xn...
细节有改动试驾2013款宝骏6... 本篇文章极速百科给大家谈谈细节有改动试驾2013款宝骏630自动型,以及2013款宝骏630舒适型对...
jetson-xavier-n... 1 sdkmanager刷写系统sdkmanager启动失败使用sdkmanager刷机时可能会遇到...
车轮为什么是圆形的(车轮为什么... 今天给各位分享车轮为什么是圆形的的知识,其中也会对车轮为什么是圆形的车轴应该装在什么位置进行解释,如...
车载以太网 - 测试用例设计 ... 关于Alive check和Mode Check相关的介绍前面的文章已经有了比较清晰的介绍,测试用例...
【Linux】信号常见概念 文章目录信号入门生活中的信号技术应用角度的信号signal函数注意事项信号的概念信号的产生信号的记录...