본문 바로가기
IT 이것저것

Ojdbc8.jar 의 NIO옵션과 Interrupt 함수 사용 시 발생하는 오류 (SQL Recoverable Exception:Closed Connection)

by 관성맨 2023. 1. 2.
반응형

 

<문제현상>

기존 사용하던 Library내 jar파일인 ojdbc7.jar를 ojdbc8.jar로 업그레이드 한 이후 기존에 잘 사용되던 서비스에 에러가 발생하며 비정상 종료되었다. 그 내용은 트랜잭션이 정상 종료되기 전에 java.sql.SQLRecoverable Exception : Closed Connection 에러가 발생하며 DB Connection이 강제 종료되는 현상이었다.

 

소스상에 변경점이 없었고 다른 변경사항도 없었으며 오로지 변경점이라고는 ojdbc7.jar를 ojdbc8.jar로 변경한 것 뿐인데 이런 현상이 발생하니 처음에는 굉장히 당황했었는데 원인은 아래와 같았다.

 

 

<문제원인>

1) ojdbc8.jar 부터 NIO 옵션이 추가되었다. (해당 옵션의 default값은 TRUE)

2) 해당 NIO 옵션은 Interrupt() 함수와 만나면 DB Connection이 종료되어버리는 현상이 발생한다.

3) ojdbc7.jar 이하 버전은 DB Connection 시 일반적인 IO Stream을 사용하여 Interrupt 함수가 호출되더라도 트랜잭션이 다 끝날 때까지 기다린 이후에 DB Connection이 정상 종료된다.

4) ojdbc8.jar 버전은 DB Connection 이 NIO방식이라 Interrupt()함수 호출은 NIO Stream을 강제 종료시킨다.

 

- Oracle사에 문의한 답변

여기서도 이 현상에 대한 문의가 몇번 왔었나 보다.

첫 문장에 It's not a bug라고 쓰여있었다.

JDBC 12.2.0.1버전 혹은 그 이상의 버전에서는 JAVA NIO calls in Blocking Mode를 사용해서 Interrupt() 함수와 충돌이 일어난다고 하며, JDBC 이전 드라이버 버전(IO Stream 버전)에서는 Interrupt() 함수와 충돌이 일어나지 않는다 한다.

 

 

<솔루션>

원인은 알았으니, 이제 가장 중요한 어떻게 하면 이 현상을 해결할 수 있는지 솔루션을 알아보자.

 

1) 우선 오라클사의 솔루션은 서비스 스크립트에 oracle.jdbc.javaNetNio=false 옵션을 추가하라고 가이드 받았다. 

ojdbc8.jar버전부터는 NIO 옵션이 True로 추가되었기 때문에 그 옵션을 False로 바꿔줘서 NIO방식이 아닌 IO Stream방식으로 처리하도록 하는 옵션으로 보인다.

 

2) Interrupt() 함수를 사용하지 않는 방법으로 수정하여 코딩한다. Interrupt 함수 또한 정상 종료가 안되는 어떤 것을 강제로 종료시켜주는 개념인데 이 Interrupt() 함수는 보통의 경우에는 잘 사용을 하지 않는 것으로 알고 있다. 이 함수를 사용한 이유를 파악하여 수정이 가능한지 검토해보는 것도 방법이다.

 

Oracle DB JDBC JDK Ver JDBC
21C
19C
18C
12.2.0 / 12.1.0 / 11.2.0
21C
19C
18C
12.2.0
8.xx 이상 Ojdbc8.jar
7.xx Ojdbc7.jar
   

 

  • 1) JDK 7 + ojdbc7.jar는 Certified된다. (사용가능)
  • 2) JDB 7 + ojdbc8.jar는 Certified되지 않는다. (사용안하는게 좋다, 인증되지 않은 버전이라 호환성 오류 생길 수 있음)

 

 

이번 오류를 해결해보면서 몇 가지 느낀점이 있다면..

 

첫째로는 업그레이드할 때에는 기존기능이 잘 작동하는지 꼼꼼히 테스트를 해봐야하며, 기존에 사용하던 것이 문제가 없다면 해당 버전을 그대로 고수하는 것도 나쁘지 않다는 점. 굳이 변경점을 만들어서 일을 크게 만들일이 있나 싶다 (이 오류 잡느라 하루정도는 날린 것 같다)

 

둘째로는 옵션을 추가할 것이면 False로 추가해두고 필요한 사람만 해당 옵션을 True로 설정해서 사용하게 하는게 좋지 않나 싶다.. 개인적으로 아쉬운 부분이다.

반응형

댓글