java.sql.SQLSyntaxErrorException: Connection.setNetworkTimeout cannot be called on a closed connection

1. Connection.setNetworkTimeout()

Connection.setNetworkTimeout()은 JDBC 4.1 (Java 7)부터 추가된 메서드이다.

void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException

 

📌 동작 원리

  1. JDBC 드라이버에게 "네트워크 레벨에서의 대기 시간 제한" 을 설정한다.
    • 예: MySQL Connector/J는 소켓의 read timeout (SO_TIMEOUT)을 변경한다.
  2. 이 타임아웃이 지나도록 DB에서 응답이 없으면, 드라이버는 SQLTimeoutException 을 발생시킨다.
    • 즉, 쿼리 자체를 중단한다기보다, 네트워크 소켓 읽기에서 강제로 끊어버리는 동작을 수행
  3. 기본적으로 이 값은 0 (무제한)이다.
    • 즉, 타임아웃을 따로 설정하지 않으면, 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