好用的连接池-HikariCP
在Springboot的发展历程中,默认的DataSource也从Springboot1.x的tomcat连接池到Springboot2.x的HikariCP。关于HikariCP的简单使用在配置多数据源时有提到。
Hikari来自日文,是光的意思。意旨这个CP速度很快。这里是HikariCP的GitHub地址。
发展历史
成熟的数据库连接池不胜枚举,比如C3P0、DBCP。但是后来出现了一个BoneCP,这是其在GitHub上地址,它的出现很大的提升了连接池的快速特点,官方数据是C3P0的25倍。是什么概念,我也没有概念,反正就是快。但是现在BoneCP的作者对该库添加了这么一句描述 It beats older connection pools such as C3P0 and DBCP but SHOULD NOW BE CONSIDERED DEPRECATED in favour of HikariCP
,意思是说虽然BoneCP性能优于老旧的C3P0和DBCP连接池,但是现在应该被舍弃了,以迎接HikariCP。
HikariCP为什么那么快
不积硅步无以至千里,很多小的优化点的积累,HikariCP越来越快。
字节码级别优化
优化并精简字节码让最终执行的有效字节码减少,这样CPU缓存可以加载更多的程序代码。
ConcurrentBag 更好的并发集合类
ConcurrentBag的实现借鉴于C#中的同名类,是一个专门为连接池设计的lock-less集合,实现了比LinkedBlockingQueue、LinkedTransferQueue更好的并发性能。
使用FastList替代ArrayList
FastList是一个List接口的精简实现,只实现了接口中必要的几个方法。JDK ArrayList每次调用get()方法时都会进行rangeCheck检查索引是否越界,FastList的实现中去除了这一检查,只要保证索引合法那么rangeCheck就成为了不必要的计算开销(当然开销极小)。此外,HikariCP使用List来保存打开的Statement,当Statement关闭或Connection关闭时需要将对应的Statement从List中移除。通常情况下,同一个Connection创建了多个Statement时,后打开的Statement会先关闭。ArrayList的remove(Object)方法是从头开始遍历数组,而FastList是从数组的尾部开始遍历,因此更为高效。
在Springboot中使用HikariCP
Springboot2.x
在Springboot2.x的版本中默认的就是HikariCP,所以只需要根据业务需求对HikariCP的配置通过spring.datasource.hikari.*进行配置即可。
Springboot1.x
- 由于在Springboot1.x中默认使用的是tomcat连接池,所以需要移除
tomcat-jdbc
依赖。 - 通过
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
指定连接池 - 根据业务需求对HikariCP的配置通过spring.datasource.hikari.*进行配置