HikariCP连接池

什么是连接池?

一个普通的java程序,要查询或使用数据库的数据,基本流程是需要通过三次握手和四次挥手,导致进行一次操作时,要进行很多次的网络交互。
HikariCP连接池
图片转至:https://zhuanlan.zhihu.com/p/44265547
这样做的缺点有:

  • 网络io多
  • 相应时间长
  • 频繁的创建连接和关闭连接,增大服务器负担,影响其性能。

正是处于这个背景之下,连接池应运而生。那么,什么是数据库连接池呢?顾名思义,就是一个放数据库连接的池子,用户端需要的访问数据库的时候,就从连接池中取一个连接出来,用完之后,再放回去。
HikariCP连接池
图片转至:https://zhuanlan.zhihu.com/p/44265547
从上图我们可以知道,数据库的连接的创建和关闭,都由连接池完成。从而,大大的提高了效率。
我们知道了大体构造之后,我们就要了解连接池是如何管理数据库连接的。

  • 当服务器打开时,根据配置中的最小连接数,创建该数量的数据库连接,创建完成后,放入连接池中。
  • 客户端访问时,首先查看连接池是否有空闲连接,如果有,那么给客户端;如果,没有,就查看是否到达最大连接量,如果没有到最大连接量,就新创建个连接给它,反之,就让客户端处于等待状态,当等待时间超出最大等待时间,就抛出个异常个客户端。
  • 当客户端释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留等待再次使用。
  • 关闭服务器时,关闭池中所有连接,释放所有资源。

HikariCP连接池

Java中,关于数据库的连接池有很多,我们首先来看HikariCP连接池,为什么要先说这个?因为,它是所有连接池中公认最快的。
HikariCP 为什么这么快?
1、节码级别优化(很多方法通过 JavaAssist 生成)
2、大量小改进

  • 用 FastStatementList 代替 ArrayList
  • 无锁集合 ConcurrentBag
  • 代理理类的优化(比如,用 invokestatic 代替了 invokevirtual)

首先,什么是JavaAssist ?
关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令,可以采用javassist。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。(转至搜狗百科)

什么是FastStatementList?
自定义数组类型(FastStatementList)代替 ArrayList:避免每次 get() 调用都要行 range check,避免调用 remove() 时从头到尾的扫描。

什么是ConcurrentBag?
自定义集合类型(ConcurrentBag):提高并发读写的效率。

在 Spring Boot 中的配置
Spring Boot 2.x中
默认使⽤ HikariCP
配置 好spring.datasource.hikari.* 配置即可
Spring Boot 1.x中
默认使⽤用 Tomcat 连接池,需要移除 tomcat-jdbc 依赖
加入spring.datasource.type=com.zaxxer.hikari.HikariDataSource依赖

常⽤用 HikariCP 配置参数
常⽤配置 :
• spring.datasource.hikari.maximumPoolSize=10(数据库连接池的最大容量)
• spring.datasource.hikari.minimumIdle=10(最小连接ldle个数)
• spring.datasource.hikari.idleTimeout=600000(ldle的最大超时时间)
• spring.datasource.hikari.connectionTimeout=30000(等待连接的最大超时时间)
• spring.datasource.hikari.maxLifetime=1800000(一个连接的最大存活时间)

什么是minimumIdle?
控制连接池空闲连接的最小数量,当连接池空闲连接少于minimumIdle,而且总共连接数不大于maximumPoolSize时,HikariCP会尽力补充新的连接。为了性能考虑,不建议设置此值,而是让HikariCP把连接池当做固定大小的处理,默认minimumIdle与maximumPoolSize一样。
当minIdle<0或者minIdle>maxPoolSize,则被重置为maxPoolSize,该值默认为10。(转至https://blog.csdn.net/weixin_34067102/article/details/87994673)

其他配置详见 HikariCP 官⽹ https://github.com/brettwooldridge/HikariCP