Oracle 연결 오류: SQLRecoverableException – Invalid Operation, NOT Connected

1. 오류 메시지 요약

java.sql.SQLRecoverableException: IO Error: Invalid Operation, NOT Connected
    at oracle.jdbc.driver.T4CConnection.doSetNetworkTimeout(T4CConnection.java:9448)
    at com.zaxxer.hikari.pool.PoolBase.setNetworkTimeout(PoolBase.java:561)
    ...
Caused by: oracle.net.ns.NetException: Invalid Operation, NOT Connected
    at oracle.net.nt.TcpNTAdapter.setOption(TcpNTAdapter.java:761)

2. 발생 원인

  • Oracle DB와의 연결이 예기치 않게 끊긴 상태에서 커넥션 풀(HikariCP)이 네트워크 타임아웃 설정을 시도하여 발생
  • 끊긴 커넥션을 닫으려는 시점에 `setNetworkTimeout()` 호출이 포함되면 예외가 발생
  • Oracle의 세션 타임아웃(`idle_time`, `sqlnet.expire_time`) 또는 네트워크 장애 등이 원인일 수 있음

3. 자주 발생하는 상황

  • DB 재시작 또는 일시적인 네트워크 단절
  • 오래된 커넥션을 재사용하려다가 끊어진 상태인 경우
  • 커넥션 유효성 검사 설정이 누락된 경우

4. 해결 방법

4.1 HikariCP 설정 강화

spring.datasource.hikari.connection-test-query=SELECT 1 FROM DUAL
spring.datasource.hikari.validation-timeout=3000
spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.keepalive-time=300000

주의: max-lifetime은 DB의 세션 만료 시간보다 짧게 설정해야 합니다.

4.2 Oracle DB 세션 타임아웃 확인

  • sqlnet.ora에서 SQLNET.EXPIRE_TIME 값 확인
  • DB 유저에게 설정된 PROFILE idle_time도 함께 확인 필요

4.3 운영 상 참고사항

  • 이 오류는 대부분 커넥션 종료 중 로그만 출력되며, 서비스에 직접적인 장애를 주지는 않음
  • 그러나 자주 발생한다면 실제 서비스 실패 가능성도 있으므로 사전 방지가 필요함

5. 결론

해당 오류는 커넥션 풀에서 이미 종료된 커넥션을 닫는 과정에서 흔히 발생하는 예외입니다. 반복 발생 시에는 커넥션 유효성 검사를 강화하고, DB 타임아웃 설정을 검토하는 것이 중요합니다.

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다