개발서버에서 테스트하던 와중에 오랜 시간이 지난 후 WAS에서 DB로 요청을 하게 하였더니
java.sql.SQLNonTransientConnectionException: (conn=18546) Connection reset
에러가 발생하였습니다.
확인해 보니 서버 DBCP 설정에 spring.datasource.dbcp2.test-on-borrow 설정이 'true'로 되어 있었습니다.
connection pool에서 connection을 가져올 때 해당 connection이 유효한지 검증을 할 수 있게 설정하는 옵션이었습니다.
해당 옵션으로 인해 spring.datasource.dbcp2.validation-query에 설정된 쿼리가 동작하였습니다.
하지만 validation-query가 동작하였을 때 DB에 wait_timeout 옵션으로 인해 이미 모든 Connection이 끊긴 상태였고 그로 인해 해당 에러가 발생하였습니다.
wait_timeout | Idle 상태인 Connection을 끊을 때까지 서버가 대기하는 시간(default 28800초 = 8시간) |
Mysql에서 해당 쿼리로 timeout관련 설정을 조회할 수 있습니다.
show variables like '%timeout
전체적으로 봤을 때 연결을 확인만 하는 validation-query만 정상동작하지 않아 에러가 났을 뿐 다른 로직이 동작하는 데는 문제가 없었습니다.
좀 더 다른 방법이 없을까 찾아보니 주기적으로 validationQuery를 수행하여 DB에서 connection이 끊기지 않게 설정하는 방법이 존재하였고 해당 설정에 대한 옵션은 다음과 같습니다.
설정 | 설명 |
testWhileIdle | true (default false) |
validationQuery | select 1 |
timeBetweenEvictionRunsMillis | 3600000(1시간). validationQuery를 수행할 주기. Evictor 스레드가 동작하는 간격. (default -1. Evictor 스레드의 실행이 비활성화됨) |
testWhileIdle 옵션은 Idle connection에 대해 주기적으로 테스트하겠다는 옵션이고
validationQuery는 테스트에 쓰일 쿼리
timeBetweenEvictionRunsMillis는 ValidationQuery를 수행할 주기입니다.
'Database > MySQL' 카테고리의 다른 글
Mysql 통계 일 별 쿼리 작성 시 특정 범위에 없는 날짜 데이터 (0) | 2021.12.01 |
---|