当前位置:网站首页>二、HikariCP源码分析之获取连接流程二
二、HikariCP源码分析之获取连接流程二
2022-07-29 21:42:00 【InfoQ】
HikariPool的getConnection()方法
getConnection()
public final Connection getConnection() throws SQLException {
return getConnection(connectionTimeout);
}
connectionTimeout
getConnection(connectionTimeout);
public final Connection getConnection(final long hardTimeout) throws SQLException {
//①
//获取连接的时候申请令牌, 主要是为了连接池挂起的时候, 控制用户不能获取连接
//当连接池挂起的时候, Semaphore的 10000 个令牌都会被占用, 此处就会一直阻塞线程等待令牌
suspendResumeLock.acquire();
//记录获取连接的开始时间, 用于超时判断
final long startTime = clockSource.currentTime();
try {
long timeout = hardTimeout;
do {
//②
//从连接池获取连接, 超时时间timeout
final PoolEntry poolEntry = connectionBag.borrow(timeout, MILLISECONDS);
//borrow方法在超时的时候才会返回 null
if (poolEntry == null) {
break; // We timed out... break and throw exception
}
final long now = clockSource.currentTime();
//③
//获取连接的时候, 判断连接是否已经被标记移除
if (poolEntry.isMarkedEvicted() || (clockSource.elapsedMillis(poolEntry.lastAccessed, now) > ALIVE_BYPASS_WINDOW_MS && !isConnectionAlive(poolEntry.connection))) {
//如果连接超出maxLifetime, 或者连接测试不通过, 就关闭连接
closeConnection(poolEntry, "(connection is evicted or dead)"); // Throw away the dead connection (passed max age or failed alive test)
//剩余超时时间
timeout = hardTimeout - clockSource.elapsedMillis(startTime);
} else {
//④
//记录连接借用
metricsTracker.recordBorrowStats(poolEntry, startTime);
//创建ProxyConnection, ProxyConnection是Connection的包装, 同时也创建一个泄露检测的定时任务
return poolEntry.createProxyConnection(leakTask.schedule(poolEntry), now);
}
} while (timeout > 0L);
} catch (InterruptedException e) {
throw new SQLException(poolName + " - Interrupted during connection acquisition", e);
} finally {
//释放锁
suspendResumeLock.release();
}
//⑤
//获取连接超时才会执行下面的代码
logPoolState("Timeout failure ");
metricsTracker.recordConnectionTimeout();
String sqlState = null;
final Throwable originalException = getLastConnectionFailure();
if (originalException instanceof SQLException) {
sqlState = ((SQLException) originalException).getSQLState();
}
final SQLException connectionException = new SQLTransientConnectionException(poolName + " - Connection is not available, request timed out after " + clockSource.elapsedMillis(startTime) + "ms.", sqlState, originalException);
if (originalException instanceof SQLException) {
connectionException.setNextException((SQLException) originalException);
}
throw connectionException;
}
①Semaphore
suspendResumeLock.acquire();
//记录获取连接的开始时间, 用于超时判断
final long startTime = clockSource.currentTime();
suspendResumeLock
- 挂起HikariCP
- 挂起连接池
- 更改数据库连接池配置,或者更改 DNS 配置(指向新的主服务器)
- 软驱逐连接池中现有的连接
- 恢复连接池
- 怎么实现的
suspendResumeLock
com.zaxxer.hikari.util.SuspendResumeLock
Semaphore
Semaphore
Semaphore
Semaphore
Semaphore
public void suspend() {
//MAX_PERMITS = 10000
acquisitionSemaphore.acquireUninterruptibly(MAX_PERMITS);
}
suspend()
Semaphore
isAllowPoolSuspension=true
isAllowPoolSuspension
suspendResumeLock
this.suspendResumeLock = config.isAllowPoolSuspension() ? new SuspendResumeLock() : SuspendResumeLock.FAUX_LOCK;
suspendResumeLock
FAUX_LOCK
FAUX_LOCK
public static final SuspendResumeLock FAUX_LOCK = new SuspendResumeLock(false) {
@Override
public void acquire() {}
@Override
public void release() {}
@Override
public void suspend() {}
@Override
public void resume() {}
};
clockSource
②获取连接
//②
//从连接池获取连接, 超时时间timeout
final PoolEntry poolEntry = connectionBag.borrow(timeout, MILLISECONDS);
//borrow方法在超时的时候才会返回 null
if (poolEntry == null) {
break; // We timed out... break and throw exception
}
connectionBag
poolEntry
poolEntry
connectionBag
CopyOnWriteArrayList
connectionBag
connectionBag
timeout
timeout
connectionTimeout
timeout
边栏推荐
猜你喜欢
OPEN数据 | 新库上线 | CnOpenDataA股上市公司社会责任报告数据
AI全流程开发难题破解之钥
"Introduction to nlp + actual combat: Chapter 7: Dataset loading in pytorch and the use of its own datasets"
Official announcement!Suzhou Wujiang Development Zone launches electronic labor contract platform
linux install redis using script
阿里 P8 爆出的这份大厂面试指南,看完工资暴涨 30k!
【板栗糖GIS】arcmap—如何快捷替换属性表中的部分内容
【AD】【持续更新ing】关于AD设计过程中一些小细节
ict的终极模式 是软件研发
[BUG]一个数组new的时候sizeof()忘乘上个数
随机推荐
chrome集成沙拉查词
c#开发知识点总结
亚马逊登录参数metadata1,encryptedPwd逆向分析
Numpy array processing (2)
中科院TextMind(文心)安装及使用
模型评价指标汇总(持续更新)
Advanced Mathematics (Seventh Edition) Tongji University Exercises 3-7 Individual Answers
高等数学(第七版)同济大学 习题3-8 个人解答
【Verilog 设计】Verilog 实现偶数、奇数分频和任意小数分频
INFTnews | Forbes Web3 exploration
六、HikariConfig配置解析
Xshell 7 提示 “要继续使用此程序,您必须应用最新的更新或使用新版本”
对不起,你很难赚到中年人的钱
B. Party(图论/暴力/顶点的度数)
【HDLBits 刷题】Verilog Language(4)Procedures 和 More Verilog Features 部分
啊?现在初级测试招聘都要求会自动化了?
华为畅享50 Pro评测:HarmonyOS加持 更流畅更安全
解决报错 WARNING: IPv4 forwarding is disabled. Networking will not work.
leetcode-593:有效的正方形
GBASE 8s 如何通过脚本获取bufwait等统计信息