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
| 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");
return new HikariDataSource(config);
|
类
HikariDataSource:
继承自 HikariConfig 并实现了 DataSource 和 Closeable 接口。
负责管理数据库连接池的生命周期,提供连接获取、配置管理和池监控等功能。
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 封装配置不允许修改
|