当前位置:网站首页>二、HikariCP源码分析之获取连接流程二
二、HikariCP源码分析之获取连接流程二
2022-07-29 21:42:00 【InfoQ】
HikariPool的getConnection()方法
getConnection()public final Connection getConnection() throws SQLException {
return getConnection(connectionTimeout);
}
connectionTimeoutgetConnection(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 配置(指向新的主服务器)
- 软驱逐连接池中现有的连接
- 恢复连接池
- 怎么实现的
suspendResumeLockcom.zaxxer.hikari.util.SuspendResumeLockSemaphoreSemaphoreSemaphoreSemaphoreSemaphorepublic void suspend() {
//MAX_PERMITS = 10000
acquisitionSemaphore.acquireUninterruptibly(MAX_PERMITS);
}
suspend()SemaphoreisAllowPoolSuspension=trueisAllowPoolSuspensionsuspendResumeLockthis.suspendResumeLock = config.isAllowPoolSuspension() ? new SuspendResumeLock() : SuspendResumeLock.FAUX_LOCK;suspendResumeLockFAUX_LOCKFAUX_LOCKpublic 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
}
connectionBagpoolEntrypoolEntryconnectionBagCopyOnWriteArrayListconnectionBagconnectionBagtimeouttimeoutconnectionTimeouttimeout边栏推荐
猜你喜欢

SAP MIGO 报错-在例程WERT_SIMULIEREN字段NEUER_PREIS中字段溢出

HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界

品牌广告投放平台的中台化应用与实践

【R语言】【2】绘图base和lattice和ggplot2库

第3章业务功能开发(线索关联市场活动,插入数据并查询)

爽朗的一天

转:idea中language level设置

华东师范大学副校长周傲英:数据赋能,从数据库到数据中台

VSCode 插件大全

Add a logo to the upper left corner of the picture, add time and address to the lower left corner, and wrap the line when the address reaches the specified length
随机推荐
七、HikariConfig初始化分析
转:idea中language level设置
SQL教程之性能不仅仅是查询
02-SDRAM:自动刷新
Numpy数组处理(二)
SwiftUI CoreData 教程之如何加速搜索速度
外文论文的格式规范要求有哪些?
一文理解分布式开发中的服务治理
AI全流程开发难题破解之钥
第3章业务功能开发(线索关联市场活动,插入数据并查询)
SwiftUI 手势大全之可用的手势类型有哪些(教程含源码)
容器网络硬核技术内幕 (23) 权利,知识与责任
APM电机输出逻辑(Motors类详解)
linux install redis using script
一篇关于Web3.0如何走向安全时代的说明
leetcode-593:有效的正方形
官宣!苏州吴江开发区上线电子劳动合同平台
中科院TextMind(文心)安装及使用
高等数学(第七版)同济大学 习题3-8 个人解答
Leetcode 705.设计哈希集合