[英]HikariCP and maxLifetime
我將我的項目移至HikariCP 。 到目前為止一切都很好,但是在一個設置中我遇到了麻煩。
它是 HikariConfig 對象中的.setMaxLifetime(30*1000)
設置。 我收到這個警告
WARN com.zaxxer.hikari.HikariConfig - maxLifetime is less than 120000ms, using default 1800000ms.
我知道他們建議不要設置得像我想的那樣低。 但不幸的是,由於我無法改變的情況,每個打開超過 50 秒的 TCP 連接都將在我們的生產環境中終止。
我不知道你的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;
}
從這段代碼中,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;
}
}
從這段代碼來看,至少在這個版本中, maxLifeTime
已經更新為 30000ms。
因此,如果您想將 maxLifeTime 設置為 30000 毫秒,現在請將您的HikariCP
版本更新到最新版本 2.7.4。
但是,如果您使用 JDK 8 將 HikariCP 版本更新為 2.7.4,我還建議您注意兩點:
1. 將maxLifeTime
值設置為至少 30000 毫秒。
2. 將maxLifeTime
值設置maxLifeTime
比 mysql 的wait_timeout
少幾分鍾( show variables like "%timeout%"
)以避免斷開連接異常。
使用 Hikari 2.7.9 版,我進行了以下設置:
HikariConfig cpConfig = new HikariConfig();
cpConfig.setJdbcUrl(jdbcUrl);
cpConfig.setUsername(username);
cpConfig.setPassword(password);
cpConfig.setMaximumPoolSize(15);
cpConfig.setConnectionTestQuery("SELECT 1");
// performance senstive settings
cpConfig.setMinimumIdle(0);
cpConfig.setConnectionTimeout(30000);
cpConfig.setIdleTimeout(35000);
cpConfig.setMaxLifetime(45000);
cpConfig.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
HikariDataSource cpDatasource = new HikariDataSource(cpConfig);
localContainerEntityManagerFactoryBean.setDataSource(cpDatasource);
localContainerEntityManagerFactoryBean.setJpaProperties(jpaProperties);
localContainerEntityManagerFactoryBean.afterPropertiesSet();
它有效。 但請注意:
cpConfig.setMinimumIdle(0);
如果您的數據庫(例如 MSSQL)具有無限的 MaxLifetime,則必須將其嚴格設置為 0,否則您將有許多連接不會無限(無限)關閉
干杯,
阿塔尼斯·澤拉圖
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.