[JAVA] DB접속 오류 (java.sql.SQLRecoverableException: IO Error: Connection reset )

in #kr7 years ago

안녕하세요 @flyyou입니다.

이전에 제 소개를 보신분들이 계시지만 아마 기억하지 못하실 것인데요

저는 java 개발자입니다. 

나이가 먹고나니 PM도 하고 PL도 하고 하지만 아무튼 직업은 개발자인것이지요~

최근까지 클라우드 관제시스템 개발하다가 요즘은 모커피브랜드에서 프로젝트를 수행하고 있는데요

어제 발생한 오류상황 때문에 애를 좀 먹었는데

관련해서 정리를 해 보려고 합니다. (flyyou-tip) 이라는 태그를 만들어서 나중에 저만을 위한 라이브러리 역할을 하고도 싶네요


::: 이슈 배경 :::

제가 개발에 참여한 시스템은 선불카드 시스템이 적용되어 있습니다. POS에서 선불카드 결제시 연동을 통해서 수수료를 계산하고 실적을 쌓고 정산처리를 진행하는데요?

이때 선불카드 실적에 대해서 매일매일 실적을 추출해서 대사작업을 위해 SFTP를 통해 특정 G/W서버로 전송하는 데몬이 있습니다.

하지만 이 데몬에서 오류가 발생하고 실적데이터가 전달되지 않았습니다.

::: 이슈 확인 :::

오라클 11g에 접속이 안되는 현상이 발생하여 데이터 추출이 불가능 함

이전에는 아주 정상적으로 잘 수행되는 것이 어쩌다 가뭄에 콩나듯 아래의 오류가  발생함.

java.sql.SQLRecoverableException: IO Error: Connection reset

드라이버는 기존 운영시스템에 따라 11g JDBC 드라이버를 사용

::: 원인 분석 :::

11g JDBC 드라이버를 사용시에는 connect string을 암호화하기 위해서 /dev/random을 이용해서 40byte의 난수를 생성한 다음에 connect string을 암호화 한다고 합니다.

그런데 /dev/random은 변동이 적은 시스템에서는 난수 생성이 중단(block)된다는 문제점이 발생한 이력이 있고

/dev/random의 OS level문제 때문에 시스템이 조용하면 /dev/random이용시 난수생성이 원할하지 않아서 /dev/random으로부터 40byte의 난수를 얻지못한 JDBC는 connect string을 암호화하지 못하고 암호화가 되지 않아서 DB접속을 못하는 현상이 발생한다고 합니다.

::: 문제 해결 :::

/dev/random 대신 /dev/urandom을 강제적으로 사용을 하게되면 시스템 noise가 없어도 항상 난수 생성이되어서 JDBC를 이용한 접속에 문제가 발생하지 않음

urandom은 random과는 달리 entropy pool 상황에 상관없이 난수생성이 되므로 JDBC 드라이버 사용시 혹은 WAS 구동시 명시적으로 JAVA 옵션을 부여해서 문제 해결함.
(참조 :  ttp://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/)

 -Djava.security.egd=file:///dev/urandom


시스템의 noise가 적으면 /dev/random으로부터 난수생성이 잘 되지 않는다는 사실을 처음 알았습니다.

참 별의별 희안한 Case가 있네요~

Sort:  

대학교 졸업한지 얼마 안된 프로그래머에요. 인디게임을 개발하고 있습니다. 그냥.. 포스팅에 프로그래밍 관련된 글이 올라와서 좋네요. 헤헤

자바 쪽은 별로 안해봐서.. 조금 힘들긴한데 확실히 실제 적용되는 프로젝트는 많이 어려울 것 같다는 생각이 들어요. 특히나 서버 쪽 관련되서는 더 그런 것 같아요.

프로그래밍이라는 것 자체만으로도 포스팅에 흥미가 생겨서 댓글남깁니다 ㅋㅋ;;

오... 게임개발~ 멋집니다~ 저는 게임개발에 대한 지식이 전무해서~ ㅋㅋ 포스팅 잘 봐주셔서 감사합니다. 즐거운 하루 보내세요~

레벨이나 노이즈가 부하를 말하는건가요??

네 그런것 같습니다. 좀더 찾아보니 빈번한 I/O가 발생할때는 Entropy pool에 비트가 충분히 채워지고 있기때문에 해당 현상이 나타나지 않는것 같습니다.
좀더 자세히 말하면 해당 random이 블로킹된다고 하는데 시스템 이 조용하면 Entropy pool에 비트가 충분히 채워지지 않아서 그런듯 싶습니다.

시스템의 noise가 많고 적다는게 어떤건지 잘 이해가 안갔는데 댓글을 보고서야 이해가 가네요; I/O가 빈번할때 채워지는 Pool이 있는데 이것을 이용해서 /dev/random은 랜덤값을 만들어내고, 해당 시스템에서는 Pool에 충전되는 양보다 더빠르게 랜덤값을 소모해서 에러가 났다는 이야기네요 ;;
신기하네요, Xnix 커널? 버전?에 따라서 구현이 다르게 되어있을 수도 있겠네요.
ㅎㅎ 아예 java로 태그를 쓰셔도 될거같아요 ㅋㅋ

오... 잘 아시네요. 처음 알았거든요 그래서 요즘은 datasource의 커넥션풀을 제공해주는 라이브러리를 많이쓰는데 레가시 특성상 라이브러리 하나 바꾸는것도 영향이 있을거 같아서 검토중입니다.

잘은 모르지만 ㅎㅎ 군대보직도/대학전공도 다 그쪽을 해서요. 이해하는 척 한번 해봤습니다. 레가시라는 건 서버에 설치된 개발환경이 좀 옛날거라는 건가요? ㅎㅎ 하기 돌아가는 건 손대지 않는게 답이기는 하죠. 정답은 아닐 수 있어도요 ㅋㅋ

안녕하세요 opendatabase.tistory.com의 opendatbase라고 합니다
다름이 아니오라 작성하신 글이 저의 블로그에서 거의 복사된 상태로 올라와 있는것을 확인해서 이렇게 댓글을 달고 있습니다
어떤 지식이고 어떤 사실이든 다른 사이트에서 참고를 했으면 그에 맞는 출처를 작성하셔야하고
저의 포스팅은 저작자표시-비영리-변경금지가 되어있는 포스팅으로
지금 글쓰신 flyyou님은 저작자표시 위반, 비영리사용 위반, 변경금지 위반 3가지 모두 위반 하셨습니다
그 와중에 중간에 들어가있는 "(참조 : ttp://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/)" 는 멀쩡히 참고하시고
다른사이트는 참조를 거시면서 왜 제 블로그는 참조가 되어있지 않는지 더 궁금증이 생깁니다
인터넷 검색하다가 도움을 받았으면 감사하는 마음을 가지셔야지 무단으로 사용하시면 어떻하나요?
저의 부탁은 글을 내려주시던지,마지막줄에 원문출처로 제 포스팅 링크를 걸어주시던지 조치를 부탁드립니다

원문출처: https://opendatabase.tistory.com/entry/WAS-%EC%97%90%EC%84%9C-DB%EB%A1%9C-%EC%A0%91%EC%86%8D-%EB%B6%88%EA%B0%80-javasqlSQLRecoverableException-IO-Error-Connection-reset

라고만 걸어두셔도 불만가지지 않겠습니다

Coin Marketplace

STEEM 0.19
TRX 0.14
JST 0.030
BTC 60268.51
ETH 3201.96
USDT 1.00
SBD 2.43