2015-01-27 8 views
2

프로젝트를 HikariCP으로 옮겼습니다. 지금까지는 모든 것이 잘 진행되고 있지만 한 가지 설정으로는 문제가 있습니다.HikariCP와 maxLifetime

HikariConfig 개체의 설정은 .setMaxLifetime(30*1000)입니다. 나는이 경고를 받는다

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

내가 설정하려고하지 않는 것을 권장하지 않는다는 것을 알고있다. 그러나 불행하게도 내가 바꿀 수없는 환경 때문에, 50 secods보다 오래 열려있는 모든 TCP 연결은 우리의 프로덕션 환경에서 종료 될 것입니다.

+1

개선 요청을 열어야합니다. 임시 해결 방법은 해킹이지만 강제 검사없이 JMX를 통해 풀이 시작된 후 "maxLifetime"을 변경할 수 있습니다. 프로그래밍 방식의 액세스에 대해서는 다음 위키 페이지를 참조하십시오. https://github.com/brettwooldridge/HikariCP/wiki/JMX-Monitoring – brettw

+0

오, JMX를 통해 설정하는 것에 대해 생각하지 않았습니다. 기능 요청을 제출하고 그들이 무슨 말을하는지 궁금해합니다. – Gabriel

답변

0

나는 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 값 몇 분을 설정합니다.