1. 程式人生 > >Linux 使用命令執行java -jar xxx.jar 在連接數據庫時發生 java.sql.SQLRecoverableException: IO Error: Connection reset 錯誤

Linux 使用命令執行java -jar xxx.jar 在連接數據庫時發生 java.sql.SQLRecoverableException: IO Error: Connection reset 錯誤

res 修改配置文件 表示 SQ 論壇 connect linux 通過 rain

一、問題描述

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 錯誤