문제 6 · 간헐적 쿼리 실패

DB 재시작 후 풀에 남은 죽은 커넥션이 일부 요청만 실패시키는 구조

핵심은 풀 크기 부족이 아니라 stale connection 제거다. 빌려주기 전에 검사하고, 오래된 커넥션은 더 빨리 교체해야 한다.

1

DB 재시작

기존 TCP 세션이 끊기지만, 앱의 풀은 바로 그 상태를 모두 알지 못한다.

2

풀 내부에 상태가 섞임

재시작 전 커넥션은 끊겼고, 이후에 새로 만든 커넥션만 정상이다.

기존 A 끊김
기존 B 끊김
새 연결 정상
3

대여 순간에 결과가 갈림

요청이 어떤 커넥션을 빌리느냐에 따라 성공하거나, 바로 실패한다.

정상 연결을 빌림
쿼리 성공 같은 시점에도 어떤 요청은 문제없이 처리되어 장애가 숨겨진다.
끊긴 연결을 빌림
쿼리 실패 그래서 현상은 전체 장애가 아니라 간헐적 실패처럼 보인다.

앱 로그에서 먼저 보이는 신호

java.sql.SQLException: Broken pipe
... while using pooled connection

DB 재시작 직후 이런 로그가 보이면, 풀 안의 끊긴 커넥션이 재사용되는지 확인한다.

설정으로 선제 차단

validationTimeout 빌려주기 전에 짧게 유효성 검사를 수행해 죽은 커넥션을 즉시 걸러낸다.
maxLifetime 단축 커넥션을 더 빨리 교체해 재시작 이후 stale connection이 오래 남지 않게 한다.
학습 포인트

간헐 실패의 이유는 “가끔만 죽은 커넥션이 선택되기 때문”이다. 따라서 우선순위는 풀 확대보다 검증과 수명 정책 조정이다.