[MySQL] Failed to validate a poolable connection 오류 해결하기 - validationQuery

 

서버 로그 확인 중 DB 커넥션 오류 발생을 확인.

DB에 접속 중인 세션을 오랫동안 사용하지 않거나 네트워크에 문제가 발생하는 경우 DB세션이 끊어질 수 있는데,

해결방법으로 wait_timeout, autoReconnect=true, validationQuery 등이 있다.

찾아본 결과 대부분 validationQuery 방법을 추천했다

 

오류 로그
o.a.c.dbcp2.PoolableConnectionFactory    : Failed to validate a poolable connection.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 34,580,863 milliseconds ago.  The last packet sent successfully to the server was 34,580,865 milliseconds ago. is longer than the server configured value of 'wait_timeout'.  You should consider either expiring and/or testing connection validity before use in your application,  increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

etc-image-0

위 로그에서 제시한 방법은 autoReconnect=true인데, 찾아보니 주의사항이 있어 신중하게 사용해야 한다

 

 

1. wait_timeout

- wait_timeout으로 설정된 시간이 초과되면 커넥션을 종료시키는 옵션

- MySQL의 기본 연결 유지시간은 wait_timeout 시스템 변수를 통해 설정되는데, 기본값 8시간으로 설정되어 있음

  활성 상태가 아닌 경우 8시간 후에 자동으로 연결이 종료되도록 구성됨

- 옵션 값을 변경할 수 있지만, 옵션의 시간을 무한정 늘릴 수 없기 때문에 근본적인 해결책으로 보기 어려움

 

2. autoReconnect=true

- 쿼리 수행 후 DB 세션에 문제가 있으면 단순히 SQLException을 리턴한 다음 재접속 시도

- 만약 트랜잭션 구동 환경이라면 수행 중이던 작업은 롤백이 되어야 하고 남은 작업들은 수행되지 말아야 하는데

  해당 옵션은 이러한 작업을 처리하지 않음. 따라서 해당 옵션 사용 시 트랜잭션에 대한 처리를 따로 해주어야 함

 

3. validationQuery

- 커넥션의 유효성을 검사하는 옵션

  단순 검증을 위한 옵션이기 때문에 자원 소비를 최소하 하기 위해 아래와 같은 Query를 사용하도록 권장

- 오라클 : SELECT 1 FROM DUAL

  MSSQL, MYSQL : SELECT 1

  CUBRID : SELECT 1 FROM DB_ROOT

 

- 설정

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${rdb.driver}"/>
    <property name="url" value="${rdb.url}"/>
    <property name="username" value="${rdb.username}"/>
    <property name="password" value="${rdb.password}"/>
    <property name="validationQuery" value="select 1"/>
    <property name="testWhileIdle" value="true"/>
</bean>

 

참고

https://kshmc.tistory.com/entry/MyBatis-Datasource-%EC%B0%B8%EA%B3%A0

https://onewaykim.tistory.com/41