当前位置:   article > 正文

hikari初始化最小空闲连接池_fill pool skipped, pool is at sufficient level.

fill pool skipped, pool is at sufficient level.

      this.houseKeeperTask = houseKeepingExecutorService.scheduleWithFixedDelay(new HouseKeeper(), 100L, housekeepingPeriodMs, MILLISECONDS);


  • 1
  • 2
  • 3
  • 4

这段代码是 HikariCP 中用于填充连接池至 minimumIdle 配置值的核心逻辑。让我们逐行分析一下这段代码:
最小空闲连接数, 保持MinimumIdle个空闲连接,
举例,(1)MaximumPoolSize = 100, MinimumIdle= 20, IdleConnections = 0, TotalConnections= 0,则创建20个空闲连接。
(2)MaximumPoolSize = 100, MinimumIdle= 20, IdleConnections = 0, TotalConnections= 20,则创建20个空闲连接。
(3)MaximumPoolSize = 30, MinimumIdle= 20, IdleConnections = 0, TotalConnections= 20,则创建10个空闲连接。


 /**
    * Fill pool up from current idle connections (as they are perceived at the point of execution) to minimumIdle connections.
    */
   private synchronized void fillPool()
   {
      final int connectionsToAdd = Math.min(config.getMaximumPoolSize() - getTotalConnections(), config.getMinimumIdle() - getIdleConnections())//配置的最小空闲连接数-已空闲的连接数
                                   - addConnectionQueueReadOnlyView.size();
      if (connectionsToAdd <= 0) logger.debug("{} - Fill pool skipped, pool is at sufficient level.", poolName);

      for (int i = 0; i < connectionsToAdd; i++) {
         addConnectionExecutor.submit((i < connectionsToAdd - 1) ? poolEntryCreator : postFillPoolEntryCreator);
      }
   }
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这部分代码首先计算需要添加多少个连接到连接池中,以达到 minimumIdle 的配置值。这里使用了 Math.min 函数,确保添加的连接数不会超过 maximumPoolSize 的限制。同时,它还减去了已经正在被创建但尚未加入池中的连接数(addConnectionQueueReadOnlyView.size()),以防止重复计算。

   for (int i = 0; i < connectionsToAdd; i++) {
      addConnectionExecutor.submit((i < connectionsToAdd - 1) ? poolEntryCreator : postFillPoolEntryCreator);
   }
}
  • 1
  • 2
  • 3
  • 4

这部分代码则通过一个循环,将连接创建的任务提交给一个执行器(addConnectionExecutor)。这个执行器会异步地创建新的数据库连接,并将它们添加到连接池中。这里值得注意的是,最后一个连接的创建任务可能使用不同的创建者(postFillPoolEntryCreator),这可能是为了执行一些在达到 minimumIdle 后需要进行的特殊操作,比如触发某些回调或清理任务。

总的来说,这段代码展示了 HikariCP 如何智能地管理连接池的大小,确保连接池中有足够的空闲连接,同时又不会无谓地占用过多资源。它通过异步的方式创建连接,避免了阻塞主线程,同时也确保了连接的创建是在资源允许的情况下进行的,不会导致资源过度消耗。


 /**
    * Creating and adding poolEntries (connections) to the pool.
    */
   private final class PoolEntryCreator implements Callable<Boolean>
   {
      private final String loggingPrefix;

      PoolEntryCreator(String loggingPrefix)
      {
         this.loggingPrefix = loggingPrefix;
      }

      @Override
      public Boolean call()
      {
         long sleepBackoff = 250L;
         while (poolState == POOL_NORMAL && shouldCreateAnotherConnection()) {
            final PoolEntry poolEntry = createPoolEntry();
            if (poolEntry != null) {
               connectionBag.add(poolEntry);
               logger.debug("{} - Added connection {}", poolName, poolEntry.connection);
               if (loggingPrefix != null) {
                  logPoolState(loggingPrefix);
               }
               return Boolean.TRUE;
            }

            // failed to get connection from db, sleep and retry
            if (loggingPrefix != null) logger.debug("{} - Connection add failed, sleeping with backoff: {}ms", poolName, sleepBackoff);
            quietlySleep(sleepBackoff);
            sleepBackoff = Math.min(SECONDS.toMillis(10), Math.min(connectionTimeout, (long) (sleepBackoff * 1.5)));
         }

         // Pool is suspended or shutdown or at max size
         return Boolean.FALSE;
      }

      /**
       * We only create connections if we need another idle connection or have threads still waiting
       * for a new connection.  Otherwise we bail out of the request to create.
       *
       * @return true if we should create a connection, false if the need has disappeared
       */
      private synchronized boolean shouldCreateAnotherConnection() {
         return getTotalConnections() < config.getMaximumPoolSize() &&
            (connectionBag.getWaitingThreadCount() > 0 || getIdleConnections() < config.getMinimumIdle());
      }
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

HikariCP 是一个高性能的 JDBC 数据库连接池,它被设计为简单、快速和可靠。HikariCP 提供了一系列的配置参数来微调其行为,以便满足不同应用程序的需求。下面是一些主要的配置参数及其解释:

  1. maximumPoolSize

    • 描述:连接池中最大连接数。
    • 默认值:10
    • 这个参数定义了连接池能够创建的最大连接数,以防止资源耗尽。
  2. minimumIdle

    • 描述:连接池维护的最小空闲连接数。
    • 默认值:10
    • 即使没有连接请求,连接池也会保持至少这么多的连接处于空闲状态。
  3. idleTimeout

    • 描述:空闲连接存活的最大时间(毫秒)。
    • 默认值:600000(10分钟)
    • 超过这个时间后,空闲连接将被关闭,除非 minimumIdle 数量未达到。
  4. connectionTimeout

    • 描述:等待连接池分配连接的最大时长(毫秒)。
    • 默认值:30000(30秒)
    • 如果在这个时间内仍然无法获取连接,则会抛出异常。
  5. maxLifetime

    • 描述:连接在连接池中的最大生命周期(毫秒)。
    • 默认值:1800000(30分钟)
    • 连接达到这个年龄后会被替换掉,以确保连接的健康状态。
  6. autoCommit

    • 描述:从池中借出的连接是否默认自动提交事务。
    • 默认值:true
    • 设置为 false 可以让连接默认进入事务模式。
  7. dataSourceClassNamedataSource

    • 描述:指定数据源类名或直接的数据源实例。
    • 默认值:无
    • 这是用于创建连接的源头,可以是任何实现了 javax.sql.DataSource 接口的类。
  8. validationQuery

    • 描述:用于验证连接有效性的 SQL 查询语句。
    • 默认值:无
    • 在借用和归还连接时执行,以确保连接的可用性。
  9. testOnBorrow, testOnReturn, testWhileIdle

    • 描述:连接借用/归还/空闲时是否进行连接有效性测试。
    • 默认值:false
    • 这些参数控制何时进行连接的有效性检查。
  10. registerMbeans

    • 描述:是否注册 JMX MBeans 以监控连接池状态。
    • 默认值:true
    • 如果设置为 true,HikariCP 将注册 MBeans 到 JMX,提供性能监控。
  11. metricRegistry

    • 描述:自定义 Metrics Registry,用于收集和报告指标。
    • 默认值:无
    • 允许与外部监控系统集成。

以上参数可以通过不同的方式设置,如在 Spring Boot 的 application.properties 文件中,或者在 Java 代码中通过构造函数或 setter 方法传递给 HikariConfig 实例。正确的配置取决于应用程序的具体需求和环境。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号