給客戶開發(fā)了一個應用系統(tǒng),基于tomcat,用java開發(fā)的,采用前后端分離技術。系統(tǒng)使用一段時間之后,用戶報錯說,導入excel數(shù)據的時候,報錯,導致后續(xù)操作都無法進行,需要重新啟動系統(tǒng)才能夠恢復正常。
經過開發(fā)人員在測試環(huán)境分析,重新導入這個excel文件,系統(tǒng)是正常的,沒有出現(xiàn)異常。
我們猜想可能的問題:1)java導入程序出錯,導致系統(tǒng)異常;2)數(shù)據庫sql預計執(zhí)行太慢,導致死鎖。
于是上慢sql來查看數(shù)據庫,沒有發(fā)現(xiàn)執(zhí)行緩慢的sql語句。
重新測試導入程序,沒有發(fā)現(xiàn)錯誤。
是否是一個累積錯誤?
于是,模擬大量的操作,一段時間后,再導入excel文件,報錯,提示是mysql數(shù)據庫的連接數(shù)滿了。
跟著這個問題去排查程序,沒有發(fā)現(xiàn)程序異常錯誤。
猜想是,某個非常特定的分支,忘記了歸還給數(shù)據庫連接池那個連接。當多次偶然進入這個使用場景,每次都會占用一個連接,等到所有的連接都被占用,就會報這個錯誤。
如何解決?
第一, 排查程序,看是否存在沒有“歸還”給連接池,連接的問題。
第二, 設置數(shù)據庫連接池的參數(shù),當一個請求響應時間過長,就強制回收這個連接。
通過上述兩個方法,解決了這個問題。
推薦閱讀: