十一、HikariCP 源码分析之 HouseKeeper

HouseKeeper是HikariPool的内部类,负责检测时间回拨并关闭空闲时间超期的连接。当检测到时间回拨时,它会关闭所有连接并重新填充。此外,它还定期清理超过最大空闲时间的连接,确保连接池的效率和健康。HouseKeeper的执行间隔、配置刷新以及对系统时间变化的处理机制都是其关键功能点。
源代码版本 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值