HikariCP와 JPA로 프로젝트를 구성했는데,
갑자기 에러가 발생하였습니다.
o.h.engine.jdbc.spi.SqlExceptionHelper : hikari-pool-1 – Connection is not available, request timed out after 30000ms.
hikariCP의 옵션 중 connectionTimeout의 default 가 30000ms 인 것을 확인하고 왜 이런 일이 발생했는지 찾기 시작했습니다.
hikariCP 의 Pool에 유지시킬 수 있는 connection 개수인 maximumPoolSize의 default는 10입니다.
에러의 발생 원인은 HikariCP 데이터베이스 커넥션 풀에서 커넥션을 가져오려고 시도했지만 사용 가능한 커넥션이 없거나, 요청이 지정된 제한 시간 내에 완료되지 않아서 타임아웃이 발생한 것이었습니다.
상황은 이렇습니다.
하나의 Thread 가 DB 접근을 위해 HikariCP에 커넥션 요청을 합니다.
HikariCP 에는 놀고 있는 (유휴[idle] 상태) 커넥션을 줍니다.
또 다른 Thread들이 몰려와서 커넥션을 달라고 합니다.
HikariCP는 Pool에 유지시킬 수 있는 최대 개수인 10개를 모두 줘버립니다.
HikariCP 에는 남아있는 커넥션이 없습니다.🥹
그 와중에 [Thread-11] 이 커넥션을 내놓으라고 독촉합니다.
HiKariCP 가 커넥션이 없어 주지 못하자 [Thread-11] 은 30초를 기다리다 화를 내며 돌아갑니다.
화를 내면서 한 말이 "o.h.engine.jdbc.spi.SqlExceptionHelper : hikari-pool-1 – Connection is not available, request timed out after 30000ms."입니다.
하지만 엄청나게 트래픽이 몰리는 상태도 아니었고 그저 로컬에서 테스트하는 상황에서 이런 경우가 발생하였습니다.
알고 보니 동료 개발자 분께서 Spring-Data-JPA 가 아닌 EntitiyManager를 통해 커넥션을 사용하고 반환하지 않아서
누수가 생기는 문제였습니다.
이번에는 다행히 작업하신 분께서 정확한 위치를 아셔서, 해결이 되었지만 검색을 하다 보니 HikariCP에 옵션 중 누수를 확인할 수 있는 leakDetectionThreshold 도 있어서 위치를 모를 수도 있을 때는 써먹을 수 있을 것 같습니다.😎
덕분에(?) 커넥션 풀에 대한 지식이 조금 더 상승할 수 있어서 좋았던 것 같습니다.
'백엔드 > JPA' 카테고리의 다른 글
Spring-data-jpa 사용 시 @Transactional 은 꼭 있어야 할까? (0) | 2024.03.24 |
---|---|
JUnit5 Repository 테스트 하기 (0) | 2022.08.05 |
Batch Insert (0) | 2022.07.02 |