問題出現(xiàn)的背景:
最近在寫一個項目的代碼時碗誉,出現(xiàn)了一個問題,項目(Spring Boot項目)打包后放在Linux服務(wù)器執(zhí)行啟動腳本時聊闯,發(fā)現(xiàn)數(shù)據(jù)庫連接池在創(chuàng)建數(shù)據(jù)連接時總被服務(wù)端重置史简,導(dǎo)致項目無法啟動,具體的異常信息下顽频。
問題排查:
依照之前的經(jīng)驗藤肢,出現(xiàn)這個問題后對以下幾點進行了排查,最后發(fā)現(xiàn)都沒有解決這個問題糯景。
1.檢查數(shù)據(jù)庫連接池嘁圈、數(shù)據(jù)庫驅(qū)動依賴包的版本;
2.檢查數(shù)據(jù)庫連接池蟀淮、數(shù)據(jù)庫驅(qū)動的配置是否正確最住;
3.檢查數(shù)據(jù)庫會話,看應(yīng)用啟動是否成功連接到數(shù)據(jù)庫怠惶;
問題產(chǎn)生的原因:
最后經(jīng)過分析與查閱資料涨缚,最后發(fā)現(xiàn)這個異常在本問題中與依賴包和代碼的正確性沒有直接關(guān)系,而是與Linux的操作系統(tǒng)有關(guān)策治。
問題產(chǎn)生的原因是Oracle JDBC在建立連接時需要一些隨機數(shù)據(jù)用以加密session token之類的參數(shù)仗岖,在Linux操作系統(tǒng)上則是調(diào)用了與之相關(guān)的是/dev/random,由于/dev/random在一些條件下會發(fā)生堵塞現(xiàn)象览妖,所以導(dǎo)致JDBC連接被重置轧拄。
下面科普一下/dev/random與/dev/urandom的差別:
1. /dev/random設(shè)備會返回小于熵池噪聲總數(shù)的隨機字節(jié)。Linux內(nèi)核熵池讽膏,通過搜集鍵盤檩电,鼠標,中斷府树,磁盤操作來產(chǎn)生隨機數(shù)據(jù)俐末,若熵池空了,對/dev/random的讀操作將會被阻塞奄侠,直到收集到了足夠的環(huán)境噪聲為止卓箫。
2./dev/urandom則是一個非阻塞的發(fā)生器。它會重復(fù)使用熵池中的數(shù)據(jù)以產(chǎn)生偽隨機數(shù)據(jù)垄潮,這表示對/dev/urandom的讀取操作不會產(chǎn)生阻塞烹卒,但其輸出的熵可能小于/dev/random。
解決辦法:
在項目啟動的時候使用參數(shù)-Djava.security.egd=file:/dev/../dev/urandom對項目進行啟動弯洗。
參考文章:
https://community.oracle.com/message/3701989
http://www.cnblogs.com/blfshiye/p/5145621.html