HikariCP
This content is not available in your language yet.
HikariCP 把连接池的核心热路径压缩到一个低竞争资源容器和一个清晰的连接生命周期:配置完成后封存,借出时包装代理,归还时重置状态,后台任务负责驱逐、保活和补充。
本册问题地图
Section titled “本册问题地图”HikariCP 的关键不是“连接池 API”,而是高并发下连接从可用到失效的状态管理:
- ConcurrentBag 优化了什么? 优先从线程熟悉的连接和等待线程中快速匹配,减少热路径竞争;它不是完全无锁,也不能消除数据库连接创建成本。
- 连接何时创建、借出、归还和驱逐? 池启动和补充任务负责创建,业务线程借用后必须归还,生命周期、空闲和健康检查决定何时淘汰。
- 为什么代理归还要 reset? 一个请求改变的事务、只读、隔离级别等状态必须清掉,否则下一个请求会继承隐式上下文。
- keepalive 与 maxLifetime 如何配合? 前者防止长期空闲连接被网络设备清理,后者错峰淘汰老连接;两者都不能修复数据库本身不可用。
- 泄漏检测如何解释? 它发现的是连接长期未归还的迹象,慢 SQL 或长事务可能是合法占用,必须结合调用栈和业务时长判断。
| 项 | 值 |
|---|---|
| 仓库 | brettwooldridge/HikariCP |
| 本地路径 | E:\source\java\storage\hikaricp |
| 分支 | dev |
| Commit | a4d93f4f85517f90e632b795486d7102e933d7ff(2026-06-15) |
| 最近 tag | HikariCP-7.1.0 |
本册坐标均基于上述 commit;上游演进后行号可能漂移。
| 模块 | 职责 | 关键类 |
|---|---|---|
| 配置 | 校验、默认值和不可变封存 | HikariConfig、HikariDataSource |
| 池核心 | 创建、借还、驱逐和关闭 | HikariPool、PoolBase |
| 并发容器 | 低竞争资源分配 | ConcurrentBag |
| 资源条目 | 连接状态、生命周期任务 | PoolEntry |
| JDBC 代理 | 状态追踪、重置和泄漏检测 | ProxyConnection、ProxyStatement |
| 指标 | 等待、使用、创建、超时和池状态 | MetricsTracker、PoolStats |
读码入口顺序
Section titled “读码入口顺序”HikariDataSource#getConnection:延迟启动和配置封存。HikariPool#getConnection:等待、借出和代理创建。ConcurrentBag#borrow/requite:理解热路径。ProxyConnection#close:连接关闭为何变成回收与重置。HouseKeeper、MaxLifetimeTask、KeepaliveTask:后台维护。MetricsTracker与PoolStats:指标如何不侵入池逻辑。
| 对象 | 对照点 |
|---|---|
| Druid | Druid 横切能力更丰富;HikariCP 更聚焦连接池热路径 |
| ShardingSphere | HikariCP 管理物理连接;ShardingSphere 管理 SQL 路由和执行上下文 |
| ConcurrentHashMap | 都强调低锁竞争,但 ConcurrentBag 还要表达资源借用状态和等待唤醒 |