当前位置:网站首页 > 技术博客 > 正文

hikaricp连接池配置



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虽然代码比较少,但是麻雀虽小五脏俱全,涉及到很多知识点

  1. 单例模式
  2. JMX
  3. 字节码增强,代理模式
  4. 并发数据结构
  5. 监控集成

希望大家能从本文能收获一些东西,再见。

  • 上一篇: sudo在linux
  • 下一篇: xss攻击的定义
  • 版权声明


    相关文章:

  • sudo在linux2025-06-26 20:00:59
  • springboot做增删改查2025-06-26 20:00:59
  • 启动项管理完整版apk2025-06-26 20:00:59
  • pstree命令2025-06-26 20:00:59
  • 迈迪工具集教程2025-06-26 20:00:59
  • xss攻击的定义2025-06-26 20:00:59
  • 大麦网爬虫抢票2025-06-26 20:00:59
  • java单元测试是什么意思2025-06-26 20:00:59
  • insight软件安装手册2025-06-26 20:00:59
  • mnist数据集有什么特点2025-06-26 20:00:59