Hikari使用配置与源码分析

发布时间:2022-06-20 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Hikari使用配置与源码分析脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

一、SpringBoot2.x 默认连接池 HikariCP简单配置

现在国内用的最多的数据库连接池无疑是druid,因为它的监控功能实在太好用了,另外性能、稳定性、社区活跃度等各方面几乎没啥大的缺点。我们公司自然也是用的druid,这导致我一直没意识到springboot默认的连接池的存在。直到今天,我新建了一个springboot项目,导入jpa和web依赖包,配置好mysql地址,发现数据库连接竟然失败了。

我发现日志里有打印

MyHikariCP - Starting...

然后嘛,就是在启动这个连接池的过程中报错了。带着好奇心百度了下这个是啥玩意儿,一查才知道,这个是springboot2.x默认的数据库连接池,而springboot1.x默认的是tomcat连接池

于是我在网上找了份HikariCP的标准配置文件,只需改下数据库名和账号密码就能正常使用了。

## 数据库配置
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username = root
spring.datasource.password = root
##  Hikari 连接池配置 ------ 详细配置请访问:https://github.com/brettwooldridge/HikariCP
## 最小空闲连接数量
spring.datasource.hikari.minimum-idle=5
## 空闲连接存活最大时间,默认600000(10分钟)
spring.datasource.hikari.idle-timeout=180000
## 连接池最大连接数,默认是10
spring.datasource.hikari.maximum-pool-size=10
## 此属性控制从池返回的连接的默认自动提交行为,默认值:true
spring.datasource.hikari.auto-commit=true
## 连接池母子
spring.datasource.hikari.pool-name=MyHikariCP
## 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
spring.datasource.hikari.max-lifetime=1800000
## 数据库连接超时时间,默认30秒,即30000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1

二、HikariCP源码分析

HikariCP使用Javassist字节码操作库来实现动态代理,优化并精简了字节码,同时内部使用com.zaxxer.hikari.util.FastList代替了ArrayList,使用了更好的并发集合类com.zaxxer.hikari.util.ConcurrentBag,号称是目前最快的数据库连接池。

1. HikariPool和PoolEntry

HikariPool有三个内部类,其中一个是自定义的运行时异常,暂且不谈。另两个分别是HouseKeeper和PoolEntryCreater。HouseKeeper是一个Runnable线程,PoolEntryCreator是一个Callable执行单元。Hikari在自己的构造方法里使用了这两个线程类。

public HikariPool(){

  this.poolEntryCreator = new HikariPool.PoolEntryCreator((String)null);

  this.houseKeepingExecutorService = this.initializeHouseKeepingExecutorService();

  this.houseKeeperTask = this.houseKeepingExecutorService.scheduleWithFixedDelay(new HikariPool.HouseKeeper(), 100L, this.housekeepingPeriodMs, TimeUnit.MILLISECONDS);

}

先看下HikariPool的getConnection方法,里面调用了poolEntry.createProxyConnection(),poolEntry是poolEntryCreator创造出来放到ConcurrentBag<PoolEntry>里的,这里取出来。

再来看createProxyConnection

Connection createProxyConnection(ProxyLeakTask leakTask, long now) {
        return ProxyFactory.getProxyConnection(this, this.connection, this.openStatements, leakTask, now, this.isReadOnly, this.isAutoCommit);}

终于走到ProxyFactory这里,具体看下面有关hikari工厂和代理的讲解。

2. ProxyFactory

代码简化下大致是这样:

public final class ProxyFactory{
      static ProxyConnection getProxyConnection(){return new HikariProxyConnection()};       static Statement getProxyStatement(){return new HikariProxyStatement()};       static CallableStatement getProxyCallableStatement(){return new HikariProxyCallableStatement()};      static PreparedStatement getProxyPreparedStatement(){return new HikariProxyPreparedStatement()};      static ResultSet getProxyResultSet(){return new HikariProxyResultSet()};      static DatabaseMetaData getProxyDatabaseMetaData(){return new HikariProxyDatabaseMetaData()};}

因为只有一个具体工厂类,里面的工厂方法也都是静态的,所以这是一个典型的简单工厂模式。

ProxyFactory生产的是Hikari有关数据库操作相关的代理类,被代理的类是java.sql下面数据库操作的原生类。

3. hikari中的动态代理

我们用ProxyConnection这个代理类来举例,这里只贴出部分代码

public abstract class ProxyConnection implements Connection {

protected ProxyConnection(Connection connection) {
        this.delegate = connection;
    }
}

可以看到ProxyConnection实现了共用主题接口Connection,并且通过构造方法持有另一个Connection实际对象的引用。这里另一个Connection实际对方就是被代理的类。

这里使用了JavassistProxyFaxctory动态代理,是预先加载字节码的,涉及到类加载机制,我还没看懂,以后慢慢看。

4. fastlist对比arraylist

5. ConcurrentBag

这个大佬写的追光者系列Hikari三连感觉不错,推荐阅读,我自己也还没看完,mark一下有空再看。

【追光者系列】HikariCP源码分析之字节码修改类库Javassist委托实现动态代理 - 云+社区 - 腾讯云 (tencent.com)

脚本宝典总结

以上是脚本宝典为你收集整理的Hikari使用配置与源码分析全部内容,希望文章能够帮你解决Hikari使用配置与源码分析所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。