開門見山,最快捷的驗證方法和解決方案:java -Djava.security.egd=file:///dev/urandom -jar xxxxxxx.jar
描述下問題:寫了個jar工具,用到了連接池,ojdbc。windows環境一切正常。linux環境下啟動關閉兩三次后就出現 java.sql.SQLRecoverableException: IO 錯誤: Connection reset
排查配置文件和解析問題, 無果。
使用最新ojdbc包,無果。
更換hikari到druid,無果。
無奈搜索一番,找到了上述方案,解釋下出現這個問題的原因:
連接ORACLE服務器,客戶端要生成隨機密鑰用於客戶端認證,linux下JDK默認使用/dev/random,random采用阻塞方式生成隨機數,生成的速度很慢,ORACLE服務器會主動reset,並在alert.log中報錯:
TNS-12535: TNS:operation timed out
ns secondary err code: 12606
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0
Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.6.21)(PORT=33460))
WARNING: inbound connection timed out (ORA-3136)
其他解決方案:
編輯$JAVA_HOME/jre/lib/security/java.security將securerandom.source=file:/dev/random 改為file:/dev/urandom(urandom采用非陰塞式生成隨機數,性能很好,不會產生超時)