Linux 使用命令執行java -jar xxx.jar 在連接數據庫時發生 java.sql.SQLRecoverableException: IO Error: Connection reset 錯誤
一、問題描述
1. jar 包在未打包之前執行沒有問題
2.應用啟動慢,並且此問題是一個偶爾性質的,也就是時有時無,
3.數據庫連接數夠用
4.發生錯誤的該連接是一個新的連接,不是服務端關閉導致的問題
二、問題原因
在Linux操作系統中,有一個特殊的設備文件,可以用作隨機數發生器或偽隨機數發生器。
/dev/random
在讀取時,/dev/random設備會返回小於熵池噪聲總數的隨機字節。/dev/random可生成高隨機性的公鑰或一次性密碼本。若熵池空了,對/dev/random的讀操作將會被阻塞,直到從別的設備中收集到了足夠的環境噪聲為止。
當然你也可以設置成不堵塞,當你在open 的時候設置參數O_NONBLOCK, 但是當你read的時候,如果熵池空了,會返回-1
/dev/urandom
/dev/random的一個副本是/dev/urandom ("unlocked",非阻塞的隨機數發生器[4]),它會重復使用熵池中的數據以產生偽隨機數據。這表示對/dev/urandom的讀取操作不會產生阻塞,但其輸出的熵可能小於/dev/random的。它可以作為生成較低強度密碼的偽隨機數生成器,不建議用於生成高強度長期密碼。
三、問題解決
在JAVA中可以通過兩種方式去設置指定的隨機數發生器
1. -Djava.security.egd=file:/dev/random或者 -Djava.security.egd=file:/dev/urandom
2. 修改配置文件java.security 在jvm_home\jre\lib\security
參數securerandom.source=file:/dev/urandom
/dev/random 是堵塞的,在讀取隨機數的時候,當熵池值為空的時候會堵塞影響性能,尤其是系統大並發的生成隨機數的時候,如果在隨機數要求不高的情況下,可以去讀取/dev/urandom
四、解決參考連接
oracle論壇
JDBC Connection Reset問題分析
java中的SecureRandom在linux中的實現
Linux 使用命令執行java -jar xxx.jar 在連接數據庫時發生 java.sql.SQLRecoverableException: IO Error: Connection reset 錯誤