当前位置:网站首页>一、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
边栏推荐
猜你喜欢

Docker 下 Oracle 安装与配置

高性能数据访问中间件 OBProxy(三):问题排查和服务运维

程序员「小镇做题」出身,月薪是父母半年收入 ……

Add obsolete flag to pdf

怎样把某个公司所有的专利全部查到、一网打尽?

iNFTnews | 福布斯的Web3探索

爽朗的一天

HMS Core audio editing service audio source separation and spatial audio rendering, helping to quickly enter the world of 3D audio

阿里 P8 爆出的这份大厂面试指南,看完工资暴涨 30k!

【板栗糖GIS】arcmap—如何在表格空值处进行批量求和
随机推荐
聊聊阻容降压原理 和 实际使用的电路
jsonArray中按某字段排序
GBASE 8s 数据库的大对象和日志备份
华为畅享50 Pro评测:HarmonyOS加持 更流畅更安全
啊?现在初级测试招聘都要求会自动化了?
php反序列化结构知识点实例分析
An article to understand service governance in distributed development
SwiftUI 手势大全之可用的手势类型有哪些(教程含源码)
对不起,你很难赚到中年人的钱
我想申请专利,却没有经验,如何学会写专利申请文件?
小程序预览pdf
【Verilog 设计】Verilog 实现偶数、奇数分频和任意小数分频
GBASE 8s 通过临时表提升排序性能
九、HikariCP源码分析之ConcurrentBag二
动态规划专题
华为畅享50 Pro评测:HarmonyOS加持 更流畅更安全
结合布林线理解现货白银走势图的方法
网络通信编程基础,BIO,NIO
GBASE 8s 数据库的智能大对象备份
[Point Cloud] M3DeTR: Multi-representation, Multi-scale, Mutual-relation 3D Object Detection with Transformers