Oracle JDBC 鏈接卡死後 Connection Reset

症狀:

在Linux主機上遠程登陸,執行一個簡單的Oracle的JDBC鏈接程序(jar包),結果硬生生的卡在了鏈接創建驗證階段,而後等上幾分鐘後由於鏈接超時,鏈接被遠端的Oracle服務器reset,因而報了connection reset exceptionphp



緣由:java

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

如參考材料中所述,oracle JDBC在創建鏈接時須要一些隨機數據用以加密session token之類的東西,而這個隨機數據源默認用的是/dev/random,若是不是,反正也是一個能讓人慢的抓狂的發生源。Linux有個內核熵池(感受太裝B了),經過蒐集鍵盤,鼠標,中斷,磁盤操做來產生隨機數據,能夠經過如下命令查看當前的熵值:服務器

cat /proc/sys/kernel/random/entropy_availsession


因爲執行程序的主機沒有圖形界面只是經過遠程ssh進行鏈接,那麼熵值來源就少了兩個,若是機器比較空閒則後面兩個來源也少了,結果就是等半天來不了一個隨機數,能夠經過一下命令體驗一下,用/dev/random憋出個隨機數是多難oracle

dd if=/dev/random of=rnd_file bs=1 count=64dom


若是僥倖執行的很快,能夠多試幾回把積累起來的熵值用掉,能夠經過前面所述的方法查看當前熵值數目ssh

Linux中還有個隨機數發生器,/dev/urandom,如其名字所述,不那麼隨機的隨機發生器,就是僞隨機的,固然會快不少。參考資料中給出的把隨機源修改成/dev/urandom的方法,即在執行java程序加入命令行參數:ide

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


但是彷佛不起做用。那麼手工來增大熵值吧,能夠執行一下命令

for i in {1..100000};do cat /proc/sys/kernel/random/entropy_avail;done;


就是反覆打印當前熵值10萬次,固然根據本身測試的結果當熵值到達240+時,能夠按ctrl+c終止這個命令,此時再去執行Oracle JDBC程序,就能夠鏈接成功了(保險一點能夠等熵值更大時終止命令)。雖然不是實用的解決方案,但至少肯定了問題所在。爲了這個事,人都快奔潰了。

 

解決方案:

安裝一個爲提供提供熵的程序包

   sudo apt-get install haveged


熵池減小緣由:

因爲linux內核2.4升級到2.6後減小噪源獲取,致使隨機數生成量減小,經過使用rngd服務獲取硬件噪源,生成隨機數,補充熵池。

 

解決方案:

熵池配置:

查看是否安裝 rng-tools(默認系統已經安裝)

# echo 'EXTRAOPTIONS="--rng-device /dev/urandom"' >/etc/sysconfig/rngd

啓動服務:

# service rngd start

配置開機啓動:

# chkconfig rngd on

驗證信息:

# chkconfig --list rngd
rngd               0:off    1:off    2:on    3:on    4:on    5:on    6:off

 

測試是否成功

# dd if=/dev/random of=rnd_file bs=1 count=64

記錄了64+0 的讀入

記錄了64+0 的寫出

64字節(64 B)已複製,0.00069313 秒,92.3 kB/

相關文章
相關標籤/搜索