Interrupt와 NIO

은시앙·2021년 7월 20일
0

Weblogic Datasource 비정상 종료

Socket Server를 기동하고, 전송 받은 데이터를 Insert하는 프로그램을 작성중이었다.
Thread에서 DB 접근시 DB작업을 모두 끝내고 종료되도록 하는게 일반적이다. 그런 개념을 가지고 동작하도록 코딩을 하였으나, DB 커넥션이 비정상 종료되면서 Weblogic에 DatasourceConnection 관련 객체가 쌓이면서 메모리 누수현상이 발생하였다.

원인
interrupt() 호출이 Datasource Connection을 비정상 종료 시킴.
ojdbc7 이하 버전은 DB connection시 일반적인 IO Stream을 사용하였다. 그래서 interrupt가 호출 되더라도 DB 커넥션 수행을 모두 마친후에 graceful하게 종료될 수 있었다.
ojdbc8 이상 버전은 connection이 NIO 방식으로 처리된다. interrupt() 호출은 NIO Stream을 강제 종료시킨다

방안
1. Weblogic의 NIO방식이 아닌 IO Stream방식으로 처리되도록 JVM 옵션을 추가한다.
-Doracle.jdbc.javaNetNio=false

  1. 1번이 어려울 경우, interrupt()를 호출 하지 않도록 소스를 수정한다.

느낀점
interrupt가 NIO에 영향을 주는것을 인지하지 못했다.
비정상 종료되는 문제점을 분석하다 보니, OJDBC를 좀 더 들여다 볼 수 있었다. 또한 interrupt와 NIO의 영향도도 파악할 수 있었다.
버전이 업그레이드 되면서 기존에 수행되던 작업들이 오동작하는 현상이 발견된다.
새로운 버전이나 방법이 무조건 옳은것은 아니고, 예전의 방법을 무조건 고수하는것도 바람직하지 않다고 생각한다.
때에 따라 적정한 선택을 하는것이 현명한 선택이다.

profile
이것저것 일단 해보기!

0개의 댓글