HikariCP 连接池创建流程

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 创建 HikariCP 连接池 Demo
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC");
config.setUsername("root");
config.setPassword("root");
config.setDriverClassName("com.mysql.cj.jdbc.Driver");

// 设置配置属性
config.setMinimumIdle(2);
config.setMaximumPoolSize(10);
config.setConnectionTimeout(30000);
config.setIdleTimeout(600000);
config.setMaxLifetime(1800000);
config.setConnectionTestQuery("SELECT 1");
config.setPoolName("HikariCP-Demo-Pool");

config.setLeakDetectionThreshold(5000);

config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");

// 通过配置创建 HikariDataSource
return new HikariDataSource(config);

HikariDataSource:
继承自 HikariConfig 并实现了 DataSourceCloseable 接口。
负责管理数据库连接池的生命周期,提供连接获取、配置管理和池监控等功能。

HikariPool:
负责管理数据库连接的生命周期。
继承 PoolBase:提供了连接池的基础功能和配置管理。
实现 HikariPoolMXBean:提供 JMX 监控功能。
作用:

  • 创建和管理数据库连接
  • 提供连接获取和释放机制
  • 监控连接状态和性能指标
  • 处理连接的生命周期(创建、验证、回收、销毁)

PoolBase:
HikariCP 连接池的抽象基类,提供了连接池的核心功能实现。包含创建物理连接的方法。

HikariConfig:
HikariCP 连接池的核心配置类,管理连接池的所有配置参数。

ConcurrentBag:
存放和管理数据库连接对象的容器。

PoolEntry:
包装和管理数据库连接,放入 ConcurrentBag 里的 item。

流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1. 配置验证阶段
- 调用 configuration.validate() 验证配置参数
- 检查必要参数如jdbcUrl、username、password
- 验证连接池大小配置的合理性
- 设置默认值(如连接超时时间、验证超时时间等)
2. 配置复制阶段
- 调用 configuration.copyStateTo(this) 复制配置状态
- 将 HikariConfig 中的所有配置复制到 HikariDataSource
- 确保配置不可变,防止运行时修改
3. 连接池创建阶段
- 创建 HikariPool 实例,传入配置对象
- 调用父类 PoolBase 构造方法初始化基础功能
- 设置数据库驱动、连接URL等基本参数
4. ConcurrentBag 初始化
- 创建 ConcurrentBag 作为连接容器
- 设置状态监听器为 HikariPool 自身
5. 线程池创建
- 创建 addConnectionExecutor 用于添加连接
- 创建 closeConnectionExecutor 用于关闭连接
- 配置线程池参数(核心线程数、最大线程数、队列等)
6. HouseKeeper初始化
- 创建 ScheduledExecutorService 用于定时任务
- 启动 HouseKeeper 后台任务,定期检查连接状态
- 设置执行周期为30秒(可配置)
7. 连接填充
- 如果配置了 blockUntilFilled,阻塞直到最小连接数创建完成
- 使用 addConnectionExecutor 异步创建初始连接
- 确保连接池满足最小空闲连接数要求

代码流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
com.zaxxer.hikari.HikariDataSource#<init> 
创建 hikari 数据源
com.zaxxer.hikari.HikariConfig#<init>
创建 HikariConfig 配置
com.zaxxer.hikari.HikariConfig#validate
配置属性校验
com.zaxxer.hikari.HikariConfig#copyStateTo
复制 HikariConfig 配置属性到当前 HikariDataSource 对象里
com.zaxxer.hikari.pool.HikariPool#<init>
通过构造方法创建 hikari pool 连接池对象
com.zaxxer.hikari.pool.PoolBase#<init>
创建父类对象 pool base
com.zaxxer.hikari.pool.PoolBase#initializeDataSource
初始化物理数据源
com.zaxxer.hikari.util.DriverDataSource#<init>
创建 driver dataSource 用于获取物理连接,加载驱动 driver
com.zaxxer.hikari.pool.PoolBase#createNetworkTimeoutExecutor
对于 mysql 创建网络超时执行器
com.zaxxer.hikari.util.ConcurrentBag#<init>
创建 ConcurrentBag,用于存放连接的容器
com.zaxxer.hikari.pool.HikariPool#initializeHouseKeepingExecutorService
初始化 house keeping executor,负责执行连接维护任务.
单线程调度执行器,设置线程工厂和拒绝策略.
设置关闭后不执行延迟任务,取消时移除任务
com.zaxxer.hikari.pool.HikariPool#checkFailFast
创建连接,检查db连接性
com.zaxxer.hikari.pool.HikariPool#createPoolEntry
创建 pool entry,对应一个物理连接
com.zaxxer.hikari.pool.PoolBase#newPoolEntry
com.zaxxer.hikari.pool.PoolBase#newConnection
创建和设置物理连接
com.zaxxer.hikari.util.ClockSource#currentTime
获取当前时间
com.zaxxer.hikari.util.DriverDataSource#getConnection
创建物理连接
com.zaxxer.hikari.pool.PoolBase#setupConnection
连接属性设置
com.zaxxer.hikari.pool.PoolEntry#<init>
调用 poolEntry 构造方法创建 poolEntry
com.zaxxer.hikari.util.ClockSource#currentTime
设置 lastAccessed
com.zaxxer.hikari.util.FastList#<init>
保存openStatements
设置最大生命周期 maxLifetime
maxLifetime 添加随机值,避免大量连接同时到期
封装 MaxLifetimeTask 任务添加到 houseKeepingExecutorService 调度,保存到 poolEntry.setFutureEol
设置保活任务 keepaliveTime(如果配置了)
设置 heartbeatTime
poolEntry.setKeepalive(houseKeepingExecutorService.scheduleWithFixedDelay(new KeepaliveTask(poolEntry)))
调度保活任务
connectionBag.add(poolEntry) 创建好的连接添加到 connectionBag 容器里
创建 addConnectionExecutor,用于异步创建新连接
设置没有任务时,核心线程允许被回收
创建 closeConnectionExecutor,用于异步关闭连接
设置没有任务时,核心线程允许被回收
创建 ProxyLeakTaskFactory,连接泄漏检测任务工厂
启动 houseKeeperTask
com.zaxxer.hikari.HikariConfig#seal
封装配置不允许修改