나는 HikariCP
버전을 모르지만 버전 2.2.4에서는 위의 경고가 표시되는 이유를 찾을 수 있습니다. 합니다 (com.zaxxer.hikari.HikariConfig
에서) HikariConfig.class
:이 코드에서
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는 기본 1800000ms 사용하여 적어도 120000ms,에서. 따라서 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로 업데이트하십시오.
1. 적어도 30000ms에있을 maxLifeTime
값을 설정하려면 : JDK 8 2.7.4에 HikariCP 버전을 업데이트하면
는하지만, 나 또한 당신에게 두 점을 권장합니다.
2 깨진 연결 예외를 방지하기 위해 MySQL을의 wait_timeout
(show variables like "%timeout%"
)보다 maxLifeTime
값 몇 분을 설정합니다.
개선 요청을 열어야합니다. 임시 해결 방법은 해킹이지만 강제 검사없이 JMX를 통해 풀이 시작된 후 "maxLifetime"을 변경할 수 있습니다. 프로그래밍 방식의 액세스에 대해서는 다음 위키 페이지를 참조하십시오. https://github.com/brettwooldridge/HikariCP/wiki/JMX-Monitoring – brettw
오, JMX를 통해 설정하는 것에 대해 생각하지 않았습니다. 기능 요청을 제출하고 그들이 무슨 말을하는지 궁금해합니다. – Gabriel