<문제현상>
기존 사용하던 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로 설정해서 사용하게 하는게 좋지 않나 싶다.. 개인적으로 아쉬운 부분이다.
'IT 이것저것' 카테고리의 다른 글
SQLD:시험팁과 공부방법은 알고가자 (1) | 2023.01.08 |
---|---|
JDBC,JDK,JRE,JVM 의미 및 설명 (2) | 2023.01.07 |
빅데이터분석기사:실기 작업형2 완벽대비 (4) | 2023.01.05 |
빅데이터분석기사-실기 답안작성팁,실제후기정보 (3) | 2023.01.05 |
빅데이터분석기사-실기 합격후기 문제유형,공부방법,유의사항,꿀팁 (3) | 2023.01.03 |
댓글