HikariCP 源于日语“光”的意思(和光速一样快),它是 SpringBoot 中默认的数据库连接池。

可以有效地减少数据库连接创建、销毁的资源消耗。

HikariCP 为什么快呢?

  • 它使用 FastList 替代 ArrayList,通过初始化的默认值,减少了越界检查的操作;
  • 优化并精简了字节码,通过使用 Javassist,减少了动态代理的性能损耗,比如使用 invokestatic 指令代替 invokevirtual 指令;

javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。

  • 实现了无锁的 ConcurrentBag,减少了并发场景下的锁竞争。

你平常会把连接池设置成多大呢?

很多同学认为,连接池的大小设置得越大越好,有的同学甚至把这个值设置成 1000 以上,这是一种误解。根据经验,数据库连接,只需要 20~50 个就够用了。

具体的大小,要根据业务属性进行调整,但大得离谱肯定是不合适的。

HikariCP 官方是不推荐设置 minimumIdle最小空闲 这个值的,它将被默认设置成和 maximumPoolSize 一样的大小。

如果你的数据库Server端连接资源空闲较大,不妨也可以去掉连接池的动态调整功能。

总体来说,当你遇到下面的场景,就可以考虑使用池化来增加系统性能:

  • 对象的创建或者销毁,需要耗费较多的系统资源;
  • 对象的创建或者销毁,耗时长,需要繁杂的操作和较长时间的等待;
  • 对象创建后,通过一些状态重置,可被反复使用。

将对象池化之后,只是开启了第一步优化。

要想达到最优性能,就不得不调整池的一些关键参数,合理的池大小加上合理的超时时间,就可以让池发挥更大的价值。和缓存的命中率类似,对池的监控也是非常重要的。

具体配置:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springboot-cf
    username: root
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      minimum-idle: 10 #最小空闲连接数量
      maximum-pool-size: 15 #连接池最大连接数,默认是10
      auto-commit: true #此属性控制从池返回的连接的默认自动提交行为,默认值:true
      idle-timeout: 30000 #空闲连接存活最大时间,默认600000(10分钟)
      pool-name: DataHikariCP #连接池名称
      max-lifetime: 1800000 #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
      connection-timeout: 30000 #数据库连接超时时间,默认30秒,即30000
      connection-test-query: SELECT 1