- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我将我的项目移动到 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 至少为 120000ms,使用默认值 1800000ms。所以你不能将 maxLifeTime
设置为 30000ms(30*1000)。我猜你的 HikariCP
版本至少早于 2.2.4。
但是当你找到the latest HikariCP
version 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 设置为 30000ms,请将您的 HikariCP
版本更新到最新版本 2.7.4。
但是如果你用JDK 8更新你的HikariCP版本到2.7.4,我也推荐你两点:
<强>1。将 maxLifeTime
值设置为至少 30000 毫秒。
<强>2。将 maxLifeTime
值设置为比 mysql 的 wait_timeout
少几分钟(show variables like "%timeout%"
)以避免断开连接异常。
关于java - HikariCP 和 maxLifetime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28180562/
我将我的项目移动到 HikariCP .到目前为止一切都很好,但有一个设置我遇到了麻烦。 它是 HikariConfig 对象中的 .setMaxLifetime(30*1000) 设置。我收到这个警
我想知道如何maxLifetime和 idleTimeout设置在固定大小的 Hikari 池中运行。 在什么情况下连接会从固定大小的池中退出?并且由于池是固定大小的,是否会在退休后立即创建新连接?
光 CP 版本:2.7.4 这实际上不是问题,而是一些疑问。 a) maxLifetime :30 分钟后退出连接。它会在杀死它时自动创建一个新连接还是等待新请求然后创建一个新连接?考虑到 pool
我在延长 session 生命周期方面遇到了问题。 我试过了 //start sessions ini_set('session.gc-maxlifetime', 60*60*22); //22h e
HikariPool-1 - 无法验证连接 org.postgresql.jdbc.PgConnection@f162126(此连接已 关闭。)。可能考虑使用较短的 maxLifetime值(valu
我正在使用 mysql 数据库。它的默认等待超时为 28800 mysql> SHOW VARIABLES like '%timeout%'; +---------------------------
在 HikariCP 的文档中提到 We strongly recommend setting this value, and it should be at least 30 seconds les
我是一名优秀的程序员,十分优秀!