HikariCP和Druid对比

1、版本

  • mysql版本:8.0.27
  • HikariCP版本:3.2.0
  • Druid版本:1.1.9

2、对比结果

类别

Druid

HikariCP

获取和关闭Connection速度

较慢

较快

获取关闭Statement速度

较慢

较快

lru cache

支持

不支持

ps chace

支持

不支持

ExceptionSorter

支持

不支持

Filter扩展

支持

不支持

监控

支持(jmx/log/http)

支持(jmx/metrics)

诊断支持

LogFilter

不支持

连接泄露诊断

logAbandoned

不支持

SQL注入检查

支持

不支持

配置加密

支持

不支持

代码量

较多

较少

3、详细对比

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

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

hikaricp与java对应版本 hikaricp和druid哪个好_连接数

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

1、获取和关闭连接池

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

hikaricp与java对应版本 hikaricp和druid哪个好_连接池_02

线程数量

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

2、获取和关闭Statement

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

hikaricp与java对应版本 hikaricp和druid哪个好_spring_03

线程数量

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

2、PScache

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

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

hikaricp与java对应版本 hikaricp和druid哪个好_hikaricp与java对应版本_04

3、代码量对比

Pool

Files

line

size

HikariCP

44

8798

143,577 字节(140 KB)

Druid

1384

279700

2,715,961 字节(2.58 MB)

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的方式来开启监控

@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
Metrics

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:///brettwooldridge/HikariCP/wiki/Dropwizard-Metrics)里给出了各个指标的含义:

hikaricp与java对应版本 hikaricp和druid哪个好_数据库_05

实际的效果如下:

hikaricp与java对应版本 hikaricp和druid哪个好_数据库_06

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中对应方法可以获取到连接池监控指标。

hikaricp与java对应版本 hikaricp和druid哪个好_连接数_07

4、结论

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

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

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