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 타임아웃 설정을 검토하는 것이 중요합니다.