源代码版本 2.4.5-SNAPSHOT
HouseKeeper 是一个HikariPool的内部类,它实现了Runnable接口,也就是一个线程任务。这个任务是由ScheduledThreadPoolExecutor类型的线程池执行的,也就是说它是一个定时任务。我们在《HikariCP 源码分析之初始化分析二》中分析 HikariCP 初始化的时候,遇到了houseKeepingExecutorService的初始化,简单分析了它的初始化过程,但是这个任务是非常重要的,我们要仔细分析一下。
它的主要作用就是:检测时间回拨,并关闭空闲时间超期的连接。下面的代码依然是有详细的注释,同时也记录了我当时自己分析代码时遇到的一些疑问和解答。
我们看下代码:
/**
* HouseKeeper用于空闲连接过期
*/
private class HouseKeeper implements Runnable {
private volatile long previous = clockSource.plusMillis(clockSource.currentTime(), -HOUSEKEEPING_PERIOD_MS);
@Override
public void run() {
//①
//刷新通过MBean修改的设置
connectionTimeout = config.getConnectionTimeout();
validationTimeout = config.getValidationTimeout();
leakTask.updateLeakDetectionThreshold(config.getLeakDetectionThreshold());
//②
final long idleTimeout = config.getIdleTimeout();
final long now = clockSource.currentTime();
//检测时间回拨, 即网络对时服务对时钟的调整, 允许 128 毫秒的时间差
if (clockSource.plusMillis(now, 128) < clockSource.plusMillis(previous, HOUSEKEEPING_PERIOD_MS)) {
LOGGER.warn("{} - Retrograde clock change detected (housekeeper delta={}), soft-evicting connections from pool.",
clockSource.elapsedDisplayString(previous, now), poolName);
previous = now;
//连接池中所以的连接都标记删除
softEvictConnections();
//重新创建连
fillPool();
ret

HouseKeeper是HikariPool的内部类,负责检测时间回拨并关闭空闲时间超期的连接。当检测到时间回拨时,它会关闭所有连接并重新填充。此外,它还定期清理超过最大空闲时间的连接,确保连接池的效率和健康。HouseKeeper的执行间隔、配置刷新以及对系统时间变化的处理机制都是其关键功能点。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



