記錄一次在壓測後發現的redistemplate使用場景下,redis的連線資源沒有釋放的問題。
springboot 版本:2.1.2(排除了lettuce的依賴)
jedis版本:2.9.1
場景:高併發情況下,redistemplate獲取連線失敗並阻塞執行緒導致tps下降。
異常描述:如果設定了max-wait則在等待時間到後丟擲異常:timeout waiting for idle object。如果沒有設定,則執行緒將被一直阻塞。
public t borrowobject
(long borrowmaxwaitmillis)
throws exception
else}if
(p == null)
//.......
}
阻塞點在this.idleobjects.takefirst()方法,如果設定了等待時間,則呼叫pollfirst()。debug可以發現,資源沒有釋放。
這個可以看當前物件中的borrowedcount和returnedcount發現,borrowedcount大於returnedcount。
borrowedcount:借用的資源計數returnedcount:歸還的資源計數
borrowobject(long borrowmaxwaitmillis):獲取資源的方法本來以為是歸還資源的方法有bug導致的資源沒有歸還,但是經過多次debug分析後,發現問題點實際在於jedis的close方法上。returnobject(t obj):歸還資源的方法
public
void
close()
else
//問題點在於這裡
this
.datasource = null;
}else
}
場景描述:github issues描述在多執行緒環境下,通過debug可以看到,當前jedis物件是共享的。
假如有執行緒1,2.
當執行緒1獲取的資源的持有,執行緒2等待資源釋放場景。
然後執行緒1在執行close時,通過returnresource釋放了資源,而執行緒2拿到了資源。
然後執行緒2也執行到了close方法,而執行緒1執行了this.datasource = null;
這時執行緒2則不會歸還資源,直接執行了close,導致出現的連線沒有釋放問題。
解決方式:公升級jedis版本或者回退jedis版本。
更換連線,可以考慮使用lettuce。
ios crash問題記錄
1.誤將nsmutablearray型別的變數初始化為nsarray,結果對nsmutablearray型別變數進行操作時,crash h檔案如下 inte ce movemecontroller secondlevelviewcontroller property nonatomic,retain...
??? nginx lua問題記錄
問題1 當用http localhost test 訪問時,結果為何迥異?eg1 location test 結果為空,說明執行的是httpechomodule的echo指令,沒有執行httpluamodule的content by lua指令 eg2 location test輸出123 說明執行...
sphinx 問題記錄
indexer error while loading shared libraries libmysqlclient.so.18 cannot open shared object file no such file or directory 發現sphinx indexer依賴庫ibmysqlc...