標籤:style blog http io ar java for sp 資料
坑
這絕對是我碰電腦以來遇到的第一大坑!
癥狀:
在Linux主機上遠程登入,執行一個簡單的Oracle的JDBC串連程式(jar包),結果硬生生的卡在了串連建立驗證階段,然後等上幾分鐘後因為連線逾時,串連被遠端的Oracle伺服器reset,於是報了connection reset exception
原因:
參考:http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/
如參考材料中所述,oracle JDBC在建立串連時需要一些隨機資料用以加密session token之類的東西,而這個隨機資料來源預設用的是/dev/random,如果不是,反正也是一個能讓人慢的抓狂的發生源。Linux有個核心熵池(感覺太裝B了),通過搜集鍵盤,滑鼠,中斷,磁碟操作來產生隨機資料,可以通過以下命令查看當前的熵值:
cat /proc/sys/kernel/random/entropy_avail
由於執行程式的主機沒有圖形介面只是通過遠程ssh進行串連,那麼熵值來源就少了兩個,如果機器比較空閑則後面兩個來源也少了,結果就是等半天來不了一個隨機數,可以通過一下命令體驗一下,用/dev/random憋出個隨機數是多難
dd if=/dev/random of=rnd_file bs=1 count=64
如果僥倖執行的很快,可以多試幾次把積累起來的熵值用掉,可以通過前面所述的方法查看當前熵值數目
Linux中還有個隨機數發生器,/dev/urandom,如其名字所述,不那麼隨機的隨機發生器,就是偽隨機的,當然會快很多。參考資料中給出的把隨機源修改為/dev/urandom的方法,即在執行java程式加入命令列參數:
-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程式,就可以串連成功了(保險一點可以等熵值更大時終止命令)。雖然不是實用的解決方案,但至少確定了問題所在。為了這個事,人都快奔潰了。
Oracle JDBC 串連卡死後 Connection Reset