1. 현상

springboot+springbatch 조합으로 배치 프로그램 작성

실행파일 jar를 만들어서 배치를 아래와 같이 실행. 

java -Dspring.profile.active=real -jar test-batch.jar batch01


crontab으로 스케쥴링

1시간마다 배치 실행시 오류 발생하지 않음.

5분마다 배치 실행시 첫 배치는 잘 실행 되나, 그 이후에 랜덤하게 오류 발생.


오류내용 java.sql.SQLRecoverableException: IO Error: Connection reset



2. 문제해결

실행시 다음 옵션을 줘서 해결함.(-Djava.security.egd=file:///dev/urandom)

java -Dspring.profile.active=real -Djava.security.egd=file:///dev/urandom -jar test-batch.jar batch01



3. 원인


11g JDBC 드라이버는 사용시 connect string을 암호화하기 위해서 /dev/random을 이용 40bytes의 난수를 생성하여 connect string을 암호화 하는데 /dev/random은 변동(noise)이 적은 시스템에서는 난수 생성이 중단(block)된다 는 문제점이 발생 (참조 2.1, 2.2) /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 이라는 자바옵션을 부여하여 (참조 1.1)


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


출처 :

http://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




'java' 카테고리의 다른 글

서버 Hostname 가져오기..  (0) 2016.03.09
Java 8 날짜 정리  (0) 2015.12.17
springboot connection pool 설정  (0) 2015.10.22
maven build 할때 mapper.xml 누락되는 현상  (0) 2015.03.05
spring mysql datasouce  (0) 2015.02.08
Posted by 무세1
,