HikariPool连接池超时问题

HikariPool连接池超时

超时异常错误代码

2020-04-07 10:42:43.443 [db_crawler housekeeper] WARN  com.zaxxer.hikari.pool.HikariPool - db_crawler - Thread starvation or clock leap detected (housekeeper delta=1m35s10ms834µs700ns).

2020-04-07 10:43:29.210 [master housekeeper] WARN  com.zaxxer.hikari.pool.HikariPool - master - Thread starvation or clock leap detected (housekeeper delta=47s441ms246µs200ns).

2020-04-07 10:44:13.808 [db_proc housekeeper] WARN  com.zaxxer.hikari.pool.HikariPool - db_proc - Thread starvation or clock leap detected (housekeeper delta=3m46s955ms555µs600ns).

可能原因

  • 要么是检测到等待连接的时间过长,造成进程饥饿;要么是检测到时钟跳动,反正最后是关闭了数据库连接。
  • 任务被什么进程阻塞

源码

public void run()
      {
         try {
            // refresh values in case they changed via MBean
            connectionTimeout = config.getConnectionTimeout();
            validationTimeout = config.getValidationTimeout();
            leakTaskFactory.updateLeakDetectionThreshold(config.getLeakDetectionThreshold());
            catalog = (config.getCatalog() != null && !config.getCatalog().equals(catalog)) ? config.getCatalog() : catalog;

            final long idleTimeout = config.getIdleTimeout();
            final long now = currentTime();

            // Detect retrograde time, allowing +128ms as per NTP spec.
            if (plusMillis(now, 128) < plusMillis(previous, HOUSEKEEPING_PERIOD_MS)) {
               LOGGER.warn("{} - Retrograde clock change detected (housekeeper delta={}), soft-evicting connections from pool.",
                           poolName, elapsedDisplayString(previous, now));
               previous = now;
               softEvictConnections();
               return;
            }
            else if (now > plusMillis(previous, (3 * HOUSEKEEPING_PERIOD_MS) / 2)) {
               // No point evicting for forward clock motion, this merely accelerates connection retirement anyway---没有任何必要将时钟向前移动,这只会加速连接的退出


               //.....没错,就是它 在这里..................................
               LOGGER.warn("{} - Thread starvation or clock leap detected (housekeeper delta={}).", poolName, elapsedDisplayString(previous, now));
			   //........................................................




            }

            previous = now;

            String afterPrefix = "Pool ";
            if (idleTimeout > 0L && config.getMinimumIdle() < config.getMaximumPoolSize()) {
               logPoolState("Before cleanup ");
               afterPrefix = "After cleanup  ";

               final List<PoolEntry> notInUse = connectionBag.values(STATE_NOT_IN_USE);
               int toRemove = notInUse.size() - config.getMinimumIdle();
               for (PoolEntry entry : notInUse) {
                  if (toRemove > 0 && elapsedMillis(entry.lastAccessed, now) > idleTimeout && connectionBag.reserve(entry)) {
                     closeConnection(entry, "(connection has passed idleTimeout)");
                     toRemove--;
                  }
               }
            }

            logPoolState(afterPrefix);

            fillPool(); // Try to maintain minimum connections
         }
         catch (Exception e) {
            LOGGER.error("Unexpected exception in housekeeping task", e);
         }
      }

解决策略之一

datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://${ip}:3306/${数据库}?useSSL=false&characterEncoding=UTF-8
    username: ${username}
    password: ${password}
    hikari:
      auto-commit: true
      #空闲连接超时时长
      idle-timeout: 60000
      #连接超时时长
      connection-timeout: 60000
      #最大生命周期,0不过期
      max-lifetime: 0
      #最小空闲连接数
      minimum-idle: 10
      #最大连接数量
      maximum-pool-size: 10
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Spring Boot 2.x时,你遇到了一个奇怪的问题,即在一段时间内不使用Redis连接和HikariPool连接池时,控制台会显示超时并重新连接,影响应用的正常访问。你提到了HikariPool连接池超时问题,并引用了错误提示信息[HikariPool-1 - Connection is not available, request timed out after XXXms]。 你检查了代码,并发现没有连接池泄漏,并且已按照网上的配置进行了validationTimeout、minimumIdle和maxLifetime的设置,但问题仍然存在。你还提到了一个有关连接池配置的想法,希望通过连接池的配置让不可用的连接失效。 在查找解决方案时,你访问了HikariCP项目的GitHub页面,并发现了一个与连接池生存期相关的配置参数。根据翻译,该参数控制连接在池中的最大生存期。连接只有在关闭后才会被移除,正在使用的连接永远不会停止。根据一种逐个连接的负衰减策略,应用较小的负衰减来避免池中连接的质量问题。建议将此值设置得比任何数据库或基础结构施加的连接时间限制短几秒钟。默认值为1800000毫秒(30分钟)。 综上所述,HikariPool连接池泄漏指的是连接池中存在不可用的连接,在一段时间内未使用时会出现连接超时问题。你可以通过调整连接池的最大生存期配置参数来解决这个问题。建议将其设置为比数据库或基础结构规定的连接时间限制短几秒钟的值,以避免连接泄漏的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [解决springboot2.x遇到的一段时间内不使用,redis连接和HikariPool连接池超时问题](https://blog.csdn.net/architect_cloud/article/details/104310782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值