公司有一個歷史的遺留專案是傳統的MVC架構的前後不分離的專案,一開始使用JDK1.7寫的,後來前一陣老闆說想在這個遠古專案上加點功能,順帶換換皮,於是乎一幫程式設計師們就用JDK1.8重新翻新了一遍專案順道改了改UI,部署的方式也從WebLogic換成了Tomcat,本地測試部署也沒啥問題,於是乎決定上生產給老闆看看,結果一上生產,不出所料果然出事兒了。
之前在本地和測試環境部署都沒有問題的專案卡在了 Deploying web application這一步不動了,碼農們嘗試了各種騷操作:重灌系統、重啟、重灌Tomcat、甚至JDK都重灌了3次,依然是卡在這個步驟過不去。
從網上搜了這個問題,目前網上出現這個問題最多的原因是因為securerandom.source=file:/dev/./urandom 沒有指定的問題,於是乎我去嘗試了這個方法,但是依然沒有效果
securerandom.source=file:/dev/./urandom 沒有指定的話你的專案只會啟動慢,但是不會像這樣卡死在這裡,我查閱了一下資料,沒有指定urandom基本上最慢10分鐘內也會正常啟動起來,所以專案的問題並不是出在這裡,於是乎為了探索一下我去檢視了tomcat的原始碼。
我們可以看到,圖片中最後一條日誌就是在這裡輸出出來的,然後一直到被catch捕獲中間並沒有日誌輸出,所以我們可以排除程式的執行緒並沒有因為異常而中斷,而是卡死在了中間的某個執行步驟上。
為了斷定到底是卡在了哪裡,我決定檢視一下執行緒執行的堆疊的詳細資訊,我使用的工具是阿里的Arthas,下載好之後,我們啟動Arthas後,然後輸入dashboard,然後我就發現main居然一直是WATTING狀態,他居然被掛起了
然後我們執行thrad 1 檢視main的堆疊資訊,好傢伙原來罪魁禍首在這裡,C3P0阻塞卡死了,應該是連線池的引數沒有寫對導致的問題。
折騰了半天竟是因為這種錯誤。
最後為了先快速上線解決問題,直接更換了資料庫連線池,換成了Druid.