1. Connection.setNetworkTimeout()
Connection.setNetworkTimeout()은 JDBC 4.1 (Java 7)부터 추가된 메서드이다.
void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException
📌 동작 원리
- JDBC 드라이버에게 "네트워크 레벨에서의 대기 시간 제한" 을 설정한다.
- 예: MySQL Connector/J는 소켓의 read timeout (SO_TIMEOUT)을 변경한다.
- 이 타임아웃이 지나도록 DB에서 응답이 없으면, 드라이버는 SQLTimeoutException 을 발생시킨다.
- 즉, 쿼리 자체를 중단한다기보다, 네트워크 소켓 읽기에서 강제로 끊어버리는 동작을 수행
- 기본적으로 이 값은 0 (무제한)이다.
- 즉, 타임아웃을 따로 설정하지 않으면, DB 응답이 영원히 안 와도 (네트워크 끊김, DB 서버 hang 등) 쓰레드가 무한 대기한다.
- 즉, 타임아웃을 따로 설정하지 않으면, DB 응답이 영원히 안 와도 (네트워크 끊김, DB 서버 hang 등) 쓰레드가 무한 대기한다.
2. HikariCP와의 관계
- HikariCP는 커넥션 풀에서 커넥션 유효성을 검사할 때 내부적으로 setNetworkTimeout()을 잠깐 걸어둔다.
- 이유: "이 커넥션이 살아 있는지 확인"하면서 네트워크가 응답 없을 경우, 무한 대기하지 않고 빠르게 끊어내기 위함
- 따라서 DB가 이미 연결을 끊어버린 상태라면 → setNetworkTimeout() 호출 시점에 "닫힌 커넥션" 에러가 발생할 수 있다.
3. 에러의 원인
- DB wait_timeout = 1800초 (30분)
- HikariCP maxLifetime = 60분
➡️ Application의 Connection Pool에서는 "아직 60분 동안 쓸 수 있는 커넥션"이라고 믿지만, DB는 이미 30분째 아무 쿼리가 없으니 연결을 끊어버림
➡️ 그 후 애플리케이션이 해당 커넥션을 꺼내 쓰려 하면, 사실 물리적으로 끊긴 연결이라
Connection.setNetworkTimeout cannot be called on a closed connection 같은 에러가 발생
'DB + SQL' 카테고리의 다른 글
| [Oracle] - Oracle Package (0) | 2025.11.19 |
|---|---|
| Android에서 로컬 데이터베이스 접근하기 (0) | 2025.10.24 |
| SQL - WITH 사용법 (1) | 2024.02.02 |
| SQL - COALESCE (0) | 2023.11.07 |
| SQL문의 처리과정에 대해 - parsing, execution, fetch (0) | 2023.08.30 |