HikariCP и maxLifetime

Я перенес свой проект в HikariCP. Пока все идет хорошо, но с одной настройкой у меня проблемы.

Это параметр .setMaxLifetime(30*1000) в объекте HikariConfig. Я получаю это предупреждение

WARN com.zaxxer.hikari.HikariConfig - maxLifetime is less than 120000ms, using default 1800000ms.

Я знаю, что они рекомендуют не устанавливать, так низко, как я пытаюсь. Но, к сожалению, из-за обстоятельств, которые я не могу изменить, каждое TCP-соединение, которое открыто дольше 50 секунд, будет прекращено в нашей производственной среде.

1 ответ

я не знаю вашу версию HikariCP, но в версии 2.2.4 вы найдете причину, по которой она выкинет вышеуказанное предупреждение. HikariConfig.classcom.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;
 }

из этого кода maxLifeTime составляет не менее 120000 мс, используя по умолчанию 1800000мс. поэтому вы не можете установить maxLifeTime на 30000 мс (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;
 }

}

из этого кода maxLifeTime обновляется до 30000 мс, по крайней мере, в этой версии.

Теперь, пожалуйста, обновите версию HikariCP до последней версии 2.7.4, если вы хотите установить maxLifeTime на 30000 мс.

Но если вы обновите версию HikariCP до версии 2.7.4 с помощью JDK 8, я также рекомендую вам два момента:

1. установить значение maxLifeTime как минимум 30000 мс.

2. установить значение maxLifeTime несколько минут меньше, чем mysql wait_timeout (show variables like "%timeout%"), чтобы избежать нарушения соединения.

licensed under cc by-sa 3.0 with attribution.