Oracle JDBC 串連卡死後 Connection Reset

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.