HikariCP数据库连接池是spring boot的默认数据库连接池,看名字我以为是日本人写的,后来才知道是一个常年居住在东京的美国人写的,spring默认把hikari作为数据库连接池的原因也很简单,因为它足够快,代码量少,稳定,虽然功能不及Druid,但是对于监控也有一定的扩展性,简单,快速,稳定是其胜出的原因。目前支持JDK8的最新版本是4.0.3,在GitHub开源,项目地址
现在由于spring的普及,以及spring boot的集成便利性,无论是使用JPA还是MyBatis,底层ORM已经非常成熟,即便是基于学习也很少有人手动建立数据库连接,并执行SQL了,如果不使用数据库连接池,完全手动连接数据库,并执行SQL应该怎么做呢,让我们回到刀耕火种的时代,再怀旧一下。

原理是通过即可加载到实现。
在系统初始化的时候,在内存中开辟一片空间,将一定数量的数据库连接作为对象存储在对象池里,并对外提供数据库连接的获取和归还方法。用户访问数据库时,并不是建立一个新的连接,而是从数据库连接池中取出一个已有的空闲连接对象;使用完毕归还后的连接也不会马上被关闭,而是由数据库连接池统一管理回收,为下一次借用做好准备。如果由于高并发请求导致数据库连接池中的连接被借用完毕,其他线程就会等待,直到有连接被归还。整个过程中,连接并不会被关闭,而是源源不断地循环使用,有借有还。数据库连接池还可以通过设置其参数来控制连接池中的初始连接数、连接的上下限数,以及每个连接的最大使用次数、最大空闲时间等,也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

由于spring boot 2.x开始数据库连接池已经默认是HikariCP了,所以我们只需要进行配置即可,那都有哪些配置项需要配置呢,又有哪些需要注意的地方呢?
默认是怎么生效的
我们先来看下,spring boot 2.6.1是怎么默认使用HikariCP为数据库连接池的。
只要在pom.xml引入starter-jdbc,则默认就引入了HikariCP数据库连接池,我们看下spring-boot-starter-jdbc的pom.xml
可以看到jdbc依赖了HikariCP,并且版本是4.0.3最新版本。了解spring boot starter机制的应该知道,除了pom依赖,还需要有autoconfig

配置项注意点


可以看到活跃连接1个,已经没有空闲的了,这个时候我们访问/hikari

变成了1个活跃,1个等待,并且30秒报了超时异常。

之前已经看到spring boot启动的时候,会初始化HikariDataSource,关键代码
再看一下HikariDataSource的类图

由于HikariDataSource继承自HikariConfig,并且所以我们在application.properties里配置的属性,就初始化到了DataSource里。


核心代码


我们首先引入bytekit的pom依赖
写一个辅助类
编写实际增强代码
ProxyStatement有一个私有属性isClosed,我们都可以拿到并使用。inline代表混入到源字节码里。我们看看反编译后的样子。
反编译后虽然不太正常,但是真实增强代码确实已经添加进去了,我们执行一下看看。

确实打印了出来。
因为Hikari代码比较精简,并且在细节上下了很大功夫,除了使用静态字节码增强来优化性能之前,其在并发性能上也下了功夫,具体就是对并发数据结构的创建和使用。
ConnectionBag
ConnectionBag可以说是hikari的核心,所有连接的创建,获取,归还,释放等等都和其息息相关,先来看下类结构。

最核心的几个方法是add,borrow,requite,remove。ConnectionBag内部使用了ThreadLocal和SynchronousQueue,CopyOnWriteArrayList以及waiters:AtomicInteger来保证并发安全以及快速获取连接。
borrow
requite
归还方法比较简单,如果有线程等待,则直接归还到handoffQueue上,快速转让,并寄存到threadLocal里,方便下次获取。
add
add方法不对外暴露,在checkFailFast和fillPool被调用。
remove
另外一个比较重要的类就是PoolEntry,封装了Connection以及Connection对应的Statement和对应的使用状态等,这里存储Statement也是使用的FastList。ConcurrentBag里存储的就是PoolEntry对象。
启动项目,通过http://localhost:8080/actuator/ 访问


通过集成Prometheus以及Grafana则可以收集并图形化展示监控数据,这里就不做过多介绍了。
hikari虽然代码比较少,但是麻雀虽小五脏俱全,涉及到很多知识点
- 单例模式
- JMX
- 字节码增强,代理模式
- 并发数据结构
- 监控集成
希望大家能从本文能收获一些东西,再见。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/6293.html