개발햄비

[버그해결] DB접속 오류 java.sql.SQLRecoverableException: IO Error: Connection 본문

개발/버그 해결 기록

[버그해결] DB접속 오류 java.sql.SQLRecoverableException: IO Error: Connection

개발햄 2021. 10. 2. 12:52

이슈.


오라클 11g에 접속이 안되는 현상이 발생

java.sql.SQLRecoverableException: IO Error: Connection reset

 

원인 


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접속을 못하는 현상이 발생한다고 합니다.

 

해결


11g JDBC 드라이버는 사용시 connect string을 암호화하기 위해서 /dev/random을 이용 40bytes의 난수를 생성하여 connect string을 암호화 하는데 /dev/random은 변동(noise)이 적은 시스템에서는 난수 생성이 중단(block)된다 는 문제점이 발생

* http://www.cl.cam.ac.uk/cgi-bin/manpage?4+random 

* http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/Unix_Env/random

 

/dev/random의 OS level문제 때문에 시스템이 조용하면 /dev/random이용한 난수 생성이 원활하지 않고, 난수생성이 안되어 11g JDBC사용을 필요로 할때 noise가 적어 /dev/random으로부터 40byte의 난수를 얻지 못한 JDBC는 connect string을 암호화 하지 못하고 암호화가 되지 않아 디비접속을 못해서 JDBC사용시 접속불가 장애가 발생한 것으로 확인

 

urandom은 random과 달리 entropy pool 상황에 상관없이 난수생성이 되므로 JDBC드라이버 사용시 혹은 WAS 구동시 명시적으로 -Djava.security.egd=file:///dev/urandom 이라는 자바옵션을 부여하여

* http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/

 

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

 

/dev/random 대신 /dev/urandom을 사용.

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