赞
踩
类别 | Druid | HikariCP |
---|---|---|
获取和关闭Connection速度 | 较慢 | 较快 |
获取关闭Statement速度 | 较慢 | 较快 |
lru cache | 支持 | 不支持 |
ps chace | 支持 | 不支持 |
ExceptionSorter | 支持 | 不支持 |
Filter扩展 | 支持 | 不支持 |
监控 | 支持(jmx/log/http) | 支持(jmx/metrics) |
诊断支持 | LogFilter | 不支持 |
连接泄露诊断 | logAbandoned | 不支持 |
SQL注入检查 | 支持 | 不支持 |
配置加密 | 支持 | 不支持 |
代码量 | 较多 | 较少 |
HikariCP的作者的brettwooldridge给出的获取Connection和获取Statement性能对比。(没有找到对应的配置)
本地测试时,为了减少网络IO对测试结果的影响,数据库使用本地的mysql。两个连接池保持同样的配置:初始化连接数量10,最大连接数量20。
获取和关闭连接池时随着线程数量的上升,druid ops上升越来越慢。
线程数量 | hikaricp(ops/ms) | druid(ops/ms) | druid/hikaricp |
---|---|---|---|
1 | 14084.597 | 8101.615 | 0.575210991 |
2 | 26669.662 | 15588.456 | 0.584501446 |
4 | 54955.198 | 27153.827 | 0.494108437 |
8 | 98677.275 | 49823.081 | 0.504909372 |
16 | 176690.562 | 83694.785 | 0.473679998 |
原始数据:
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
获取Statement时候,hikaricp略强于druid,但是并没有明显的差距。
线程数量 | hikaricp(ops/ms) | druid(ops/ms) | druid/hikaricp |
---|---|---|---|
1 | 3245.305 | 3171.887 | 0.977377165 |
2 | 5941.554 | 5664.91 | 0.953439117 |
4 | 9402.591 | 8139.116 | 0.865624805 |
8 | 13509.174 | 13538.226 | 1.002150539 |
16 | 24027.376 | 22007.958 | 0.915953452 |
原始数据:
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
#druid支持PScache,配置如下:
poolPreparedStatements=true
maxOpenPreparedStatements=20
HikariCP不支持PScache,作者认为缓存Statement需要存储大量对象,并且PostgreSQL, Oracle, Derby, MySQL, DB2以及其他很多数据库的JDBC驱动都有实现PScache,在连接池上重复实现是不获益的,并且可能存在负面的影响。
Pool | Files | line | size |
---|---|---|---|
HikariCP | 44 | 8798 | 143,577 字节(140 KB) |
Druid | 1384 | 279700 | 2,715,961 字节(2.58 MB) |
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的方式来开启监控
@Bean public 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; } @Bean public FilterRegistrationBean statFilter() { //创建过滤器 FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); //设置过滤器过滤路径 filterRegistrationBean.addUrlPatterns("/*"); //忽略过滤的形式 filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; }
HikariCP从2.2.0版本以后支持Metrics,收集了Wait(获取连接耗时信息),Usage(使用连接时间信息),TotalConnections(总连接数),IdleConnections(空闲连接数),ActiveConnections(活跃连接数),PendingConnections(等待连接数)等指标,需要调用HikariConfig或者HikariDataSource来开启使用。
@Bean public 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)里给出了各个指标的含义:
实际的效果如下:
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中对应方法可以获取到连接池监控指标。
性能方面:HikariCP因为细节方面优化力度较大,性能方面强于Druid
功能丰富程度方面:Druid功能更全面除了具有连接池的基本功能以外,还支持sql级监控,支持扩展,防止SQL注入等功能。
使用热度:Druid在国内使用较多,国内有很多生产实践。HikariCP是spring boot 2.0以后默认连接池,在国外使用较多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。