표지를 제출하는 과정에서
Hikari Connection Pool이라는 문제가 발생했습니다.이 포스팅은
HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl을 파악하고 해결하는 과정을 담았습니다.
com.zaxxer.hikari.pool.PoolBase: HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl
(No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.
HikariCP는 Java 기반의 애플리케이션에서 데이터베이스 연결을 관리하는 데 사용되는 고성능 Connection Pool입니다.
Connection Polling은 데이터베이스 연결을 효율적으로 관리하기 위한 기법으로, 데이터베이스와의 연결을 미리 만들어 Pool에 저장해 두고 애플리케이션에서 요청이 있을 때마다 이를 재사용합니다.
이렇게 하면 데이터베이스 연결을 매번 새로 생성하는 대신 기존의 연결을 재사용하여 성능을 최적화할 수 있습니다.
하지만 데이터베이스에서 연결을 강제로 종료했을 경우, HikariCP는 해당 연결이 여전히 유효하다고 인식할 수 있으며, 이로 인해 끊긴 연결을 재사용하려는 시도가 발생할 수 있습니다.
예를 들어(No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value.라는 로그 메시지는 HikariCP의 MaxLifetime 설정이 데이터베이스의 wait_timeout보다 길게 설정되어 발생한 오류입니다.
MaxLifetime은 HikariCP에서 관리하는 연결의 최대 생명주기를 의미합니다. 밀리초 단위로 설정되며, 이 시간이 초과된 연결을 유효하지 않다고 간주하고 회수합니다. 즉, 설정된 시간이 지나면 해당 연결은 더 이상 사용되지 않습니다. 이러한 과정을 통해 오래된 연결에서 발생할 수 있는 잠재적인 문제를 방지할 수 있습니다.
wait_timeout은 데이터베이스에서 클라이언트의 유휴(Idle) 연결을 유지할 최대 시간을 설정합니다. 초 단위로 설정되고, 클라이언트가 지정된 시간 동안 아무런 활동도 하지 않으면 데이터베이스는 해당 연결을 자동으로 종료합니다. 이 설정으로 Idle 연결이 리소스를 점유하는 것을 방지하며 데이터베이스 성능을 보호할 수 있습니다.
이 문제를 해결하려면 HikariCP의 MaxLifetime 설정을 데이터베이스의 wait_timeout 값보다 짧게 설정하면 됩니다.

show global variables like '%time%';
제 데이터베이스 설정을 기준으로 wait_timeout 값이 180초로 설정되어 있다면, HikariCP의 maxLifetime 설정은 5~10초 정도 짧게 설정하는 것이 안전합니다.
HikariCP의 maxLifetime 설정
spring.datasource.maxLifetime=170000
상황에 따라서 spring.datasource.connection-timeout을 추가할 수 있습니다. 필수적이지는 않지만, 특정 상황에서 연결을 시도할 때 발생할 수 있는 무한 대기를 방지하기 위해 설정합니다.
이 설정은 애플리케이션이 데이터베이스에 연결을 시도할 때 최대 대기 시간을 설정하며, 이 시간이 지나면 실패로 간주됩니다.
애플리케이션의 요구사항과 인프라 상태를 고려하여 적절한 값으로 설정하는 것이 중요합니다. 대기 시간이 너무 길면 응답 지연이 발생하고, 너무 짧으면 연결 실패가 빈번해질 수 있습니다.
권장 설정