오라클DB와 연계되어 있는 JDBC Sender채널 하나가 SAP MMC(Management Console)의 Call Stack에서 장시간 스레드가 'RUNNABLE' 상태라 확인을 해보는 과정을 정리하였습니다.
실행중인 SAP_AFScheduler.Worker의 내용을 보면 마지막 실행된 프로그램이 java.net.SocketInputStream.socketRead까지이며 해당 스레드와 채널의 상태가 행(hanging)으로 보입니다.
왜 발생되고 어떻게 방지할수 있을까?
참고한 사이트의 웹로직의 내용을 보면 JDBC 컨넥션 풀이 구성된 데이터베이스가 어떠한 영향으로 SQL실행 결과에 대해 장시간 행(응답을못한 상태)현상이 보이는것이라 보이는데 이에 대한 확인방법으로는 해당 DB의 로그확인을 통한 상태확인인이 필요하다고 합니다.
또 다른 사이트를 보면 자바,스프링 기준으로 아래 타임아웃 설정을 해도
setConnectionRequestTimeout(3000)
setConnectTimeout(3000)
setReadTimeout(3000)
행 현상이 해결이 안되는지 JDK에 버그가 있다고 하며 업그레이드가 필요하다고 보입니다.
현재는 해당 현상의 발생 빈도가 적어서 신경쓰이는 문제는 아니지만 많이 진다면 타임아웃이나 다른 방법을 찾아 적용을 해보는게 좋을것 같습니다.
그 이후에 발생된 현상들을 정리해보면
똑같이 아래와 같은 콜스텍 내용을 볼수 있으며 메시지모니터링에서는 해당 메시지가 계속 Delivering 상태로 보입니다.
Thread 'SAP_AFScheduler.Worker'java.lang.Thread.State: RUNNABLEjava.net.SocketInputStream.socketRead0
몇시간 후 채널의 행 현상 사라지고
채널에러는
java.sq.SQLRecoverableException: No more data to read from socket
메시지로그는 정상, 특이점은 메시지 수행 정상로그가 09시인데 채널에러는 12시로 확인되었던적이 있습니다.
이전에 정리한 SAP_AFScheduler.Worker 관련글입니다.
댓글 없음:
댓글 쓰기