当前位置:网站首页>一、HikariCP源码分析之获取连接流程一
一、HikariCP源码分析之获取连接流程一
2022-07-29 21:42:00 【InfoQ】
HikariDataSource的getConnection()方法
com.zaxxer.hikari.HikariDataSource#getConnection()HikariDataSourceHikariDataSourcegetConnection()public Connection getConnection() throws SQLException {
//①
if (isClosed()) {
throw new SQLException("HikariDataSource " + this + " has been closed.");
}
//②
if (fastPathPool != null) {
return fastPathPool.getConnection();
}
/**
* ③
* See http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java
* GFC: 双重检查锁
* https://www.cnblogs.com/xz816111/p/8470048.html
* 如果是使用无参构造{@link #HikariDataSource()}初始化的HikariDataSource,那么默认是延迟构建HikariDataSource,
* 在第一次获取连接的时候才构建HikariDataSource
*/
HikariPool result = pool;
//B才执行到这里
if (result == null) {
synchronized (this) {
result = pool;
if (result == null) {
validate();
//A 执行到打印日志
LOGGER.info("{} - Started.", getPoolName());
pool = result = new HikariPool(this);
}
}
}
return result.getConnection();
}
getConnection()getConnection()①检查连接池状态
//①
if (isClosed()) {
throw new SQLException("HikariDataSource " + this + " has been closed.");
}
isClosed()trueisClosed()return isShutdown.get();isShutdownget()private final AtomicBoolean isShutdown = new AtomicBoolean();AtomicisShutdownAtomicIntegerAtomicLongAtomicBooleanisShutdownAtomicBooleanAtomicBooleanprivate volatile int value;volatilevaluevolatilevolatile② 两个连接池?
//②
if (fastPathPool != null) {
return fastPathPool.getConnection();
}
fastPathPoolgetConnection()result.getConnection();resultfastPathPoolHikariPool result = pool;resultpoolprivate final HikariPool fastPathPool;
private volatile HikariPool pool;
fastPathPoolfinalpoolvolatilevolatilefastPathPoolfinalpublic HikariDataSource() {
super();
fastPathPool = null;
}
public HikariDataSource(HikariConfig configuration) {
configuration.validate();
configuration.copyState(this);
LOGGER.info("{} - Started.", configuration.getPoolName());
pool = fastPathPool = new HikariPool(this);
}
fastPathPool = null;pool = fastPathPool = new HikariPool(this);fastPathPoolnullfastPathPoolpoolfastPathPoolpoolHikariPoolHikariPoolpoolfastPathPoolfastPathPoolvolatilevolatile③双重检查锁
//③
HikariPool result = pool;
//B才执行到这里
if (result == null) {
synchronized (this) {
result = pool;
if (result == null) {
validate();
//A 执行到打印日志
LOGGER.info("{} - Started.", getPoolName());
pool = result = new HikariPool(this);
}
}
}
return result.getConnection();
这个方法调用了这个方法,那个方法调用了那个方法- 分配内存空间
- 初始化对象
- 将对象指向刚分配的内存空间
poolvolatilepoolvolatilevolatilepool- http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java
- https://www.cnblogs.com/xz816111/p/8470048.html
边栏推荐
- 啊?现在初级测试招聘都要求会自动化了?
- 24-hour London gold chart analysis
- GBASE 8s 数据库复合索引
- 【Verilog】Verilog设计进阶
- GBASE 8s 如何并行执行update statistics
- 【板栗糖GIS】wps—如何查看表格中的超链接
- jsonArray中按某字段排序
- linux install redis using script
- Advanced Mathematics (Seventh Edition) Tongji University Exercises 3-8 Individual Answers
- 【AD】【持续更新ing】关于AD设计过程中一些小细节
猜你喜欢
随机推荐
HMS Core audio editing service audio source separation and spatial audio rendering, helping to quickly enter the world of 3D audio
5V升压充电8.4V芯片
[Point Cloud] M3DeTR: Multi-representation, Multi-scale, Mutual-relation 3D Object Detection with Transformers
数据安全建设
Advanced Mathematics (Seventh Edition) Tongji University Exercises 3-8 Individual Answers
【HDLBits 刷题】Verilog Language(4)Procedures 和 More Verilog Features 部分
解决reudx中的异步问题 applyMiddleware thunk
tkinter绘制组件(31)——支点标题
第3章业务功能开发(线索关联市场活动,插入数据并查询)
GBASE 8s 如何并行执行update statistics
[HDLBits brush questions] Verilog Language (4) Procedures and More Verilog Features section
一篇关于Web3.0如何走向安全时代的说明
网络通信编程基础,BIO,NIO
华东师范大学副校长周傲英:数据赋能,从数据库到数据中台
动态规划专题
SwiftUI 手势大全之可用的手势类型有哪些(教程含源码)
四、HikariCP源码分析之初始化分析一
结合布林线理解现货白银走势图的方法
程序员「小镇做题」出身,月薪是父母半年收入 ……
SwiftUI Apple App Store 发布App的初学者完整指南









