HikariCP和maxLifetime

Gab*_*iel 6 java connection-pooling hikaricp

我将项目移至HikariCP。到目前为止,一切都很好,但是在一种设置下,我遇到了麻烦。

这是.setMaxLifetime(30*1000)HikariConfig对象中的设置。我得到这个警告

WARN com.zaxxer.hikari.HikariConfig - maxLifetime is less than 120000ms, using default 1800000ms.
Run Code Online (Sandbox Code Playgroud)

我知道他们建议不要将设置设置为我尝试的那么低。但是不幸的是,由于无法更改的情况,每个打开时间超过50秒的TCP连接都将在我们的生产环境中终止。

Jav*_*all 8

我不知道你的HikariCP版本,但在 2.2.4 版本中你会发现它会抛出上述警告的原因。 HikariConfig.class(在com.zaxxer.hikari.HikariConfig):

 private void More ...validateNumerics()
  {
     Logger logger = LoggerFactory.getLogger(getClass());

     if (connectionTimeout == Integer.MAX_VALUE) {
        logger.warn("No connection wait timeout is set, this might cause an infinite wait.");
     }

     if (minIdle < 0 || minIdle > maxPoolSize) {
        minIdle = maxPoolSize;
     }

     if (maxLifetime < 0) {
        logger.error("maxLifetime cannot be negative.");
        throw new IllegalArgumentException("maxLifetime cannot be negative.");
     }
     else if (maxLifetime > 0 && maxLifetime < TimeUnit.SECONDS.toMillis(120)) {
        logger.warn("maxLifetime is less than 120000ms, using default {}ms.", MAX_LIFETIME);
        maxLifetime = MAX_LIFETIME;
     }

     if (idleTimeout != 0 && idleTimeout < TimeUnit.SECONDS.toMillis(30)) {
        logger.warn("idleTimeout is less than 30000ms, using default {}ms.", IDLE_TIMEOUT);
        idleTimeout = IDLE_TIMEOUT;
     }
     else if (idleTimeout > maxLifetime && maxLifetime > 0) {
        logger.warn("idleTimeout is greater than maxLifetime, setting to maxLifetime.");
        idleTimeout = maxLifetime;
     }
Run Code Online (Sandbox Code Playgroud)

从这段代码中,maxLifeTime 至少为 120000 毫秒,使用默认值 1800000 毫秒。所以你不能设置maxLifeTime为 30000ms(30*1000)。我猜你的HikariCP版本至少比 2.2.4 旧。

但是当你找到最新HikariCP版本 2.7.4 时。它说“我们强烈建议设置这个值,它应该至少比任何数据库或基础设施强加的连接时间限制少 30 秒。

同一个班级HikariConfig.class

private void validateNumerics() {
    if(this.maxLifetime != 0L && this.maxLifetime < TimeUnit.SECONDS.toMillis(30L)) {
        LOGGER.warn("{} - maxLifetime is less than 30000ms, setting to default {}ms.", this.poolName, Long.valueOf(MAX_LIFETIME));
        this.maxLifetime = MAX_LIFETIME;
    }

    if(this.idleTimeout + TimeUnit.SECONDS.toMillis(1L) > this.maxLifetime && this.maxLifetime > 0L) {
        LOGGER.warn("{} - idleTimeout is close to or more than maxLifetime, disabling it.", this.poolName);
        this.idleTimeout = 0L;
    }

    if(this.idleTimeout != 0L && this.idleTimeout < TimeUnit.SECONDS.toMillis(10L)) {
        LOGGER.warn("{} - idleTimeout is less than 10000ms, setting to default {}ms.", this.poolName, Long.valueOf(IDLE_TIMEOUT));
        this.idleTimeout = IDLE_TIMEOUT;
    }

    if(this.leakDetectionThreshold > 0L && !unitTest && (this.leakDetectionThreshold < TimeUnit.SECONDS.toMillis(2L) || this.leakDetectionThreshold > this.maxLifetime && this.maxLifetime > 0L)) {
        LOGGER.warn("{} - leakDetectionThreshold is less than 2000ms or more than maxLifetime, disabling it.", this.poolName);
        this.leakDetectionThreshold = 0L;
    }

    if(this.connectionTimeout < 250L) {
        LOGGER.warn("{} - connectionTimeout is less than 250ms, setting to {}ms.", this.poolName, Long.valueOf(CONNECTION_TIMEOUT));
        this.connectionTimeout = CONNECTION_TIMEOUT;
    }

    if(this.validationTimeout < 250L) {
        LOGGER.warn("{} - validationTimeout is less than 250ms, setting to {}ms.", this.poolName, Long.valueOf(VALIDATION_TIMEOUT));
        this.validationTimeout = VALIDATION_TIMEOUT;
    }

    if(this.maxPoolSize < 1) {
        this.maxPoolSize = this.minIdle <= 0?10:this.minIdle;
    }

    if(this.minIdle < 0 || this.minIdle > this.maxPoolSize) {
        this.minIdle = this.maxPoolSize;
    }

}
Run Code Online (Sandbox Code Playgroud)

从这段代码maxLifeTime来看,至少在这个版本中已经更新到 30000 毫秒。

因此,HikariCP如果您想将 maxLifeTime 设置为 30000 毫秒,现在请将您的版本更新到最新版本 2.7.4。

但是,如果您使用 JDK 8 将 HikariCP 版本更新为 2.7.4,我还建议您注意两点:

1. 设置maxLifeTime值至少为 30000ms。

2. 将maxLifeTime值设置为比mysql的wait_timeout( show variables like "%timeout%")少几分钟以避免断开连接异常。