首先讓我來描述問題
我有個系統是基於springmvc+mybatis+mysql+druid的,啟動系統剛開始用沒有問題,但是用着用着系統表象就是卡死
分析:
1:通過表象是不是有可能數據庫鎖表了,通過jvm的jstack -l pid(進程id)
如何得到進程id呢?--到jdk安裝的bin目錄執行 jps命令得到pid
打印出堆棧信息
此時沒辦法只能看druid的源碼找到
此時要引起注意,看源碼的時候一點要注意if條件的地方,此時我考慮是不是maxWait沒有配置默認為0,此時我到自己的配置文件中配置
然后再次嘗試,系統依然還是掛了,在此運行jstack堆棧信息再沒有出現上面的錯誤,到此問題沒有得到解決,告一段落
此時我發現用Druid它提供一個圖形化界面
在沒有解決問題之前這兩個值一直不相等,打開連接數和關閉數隨着請求的增多在增大,增到到連接池最大數直接掛了,問題終於算找到了,如何解決呢
1:是不是配置文件有問題,到處找資料,嘗試,問題沒有得到解決
2:嘗試不同的url請求,其中有些url是不會擴大打開和關閉連接數之差,有些會擴大(此時問題又在縮小范圍)
3:仔細看那些擴大范圍的請求,發現,這些請求都是需要分頁的請求,那些不會擴大的都是不涉及到分頁的請求(問題又在縮小范圍)
4:mybatis分頁我是寫了個攔截器通過Jdbc分頁,此時仔細看代碼發現代碼里面,當打開數據庫連接的時候有個連接對象忘記關閉了,就是如下的紅色代碼
加上去之后,再次處理問題,問題得到解決,不管怎么請求現在打開數和關閉數數據永遠相等,系統正常,問題得到解決,OH Good!!!!!!
其實之間想如果這條路走不通,我想是不是可能druid版本問題,如果此條路行不通,打算換用其他連接池試試,還有會不時是spring配置有問題等等猜測,只有對問題永不放棄,什么問題都能得到解決..................