發現問題
前些日子維護編寫的通訊伺服器時遇到了這麼乙個問題:在通訊伺服器裡有乙個資料庫連線池,為他人提供資料庫連線服務,結果發現在使用過程中連線有時會耗盡,這個問題通過除錯跟蹤發現,有「客戶」在使用資料庫連線時,總是不釋放連線(已提供了釋放連線的方法)。其實問題很好解決,找出未釋放連線的那個「客戶」然後按照getconnection,releaseconnection的方式來正確呼叫就可以了。
解決問題?
但是找出那個「客戶」很容易嗎?看看我們的整個系統吧,多達五個子系統外掛程式在使用這個服務,而且其中的資料庫連線呼叫很多,這樣找可費了大勁了。在經過大量的**審核後,終於找出未釋放連線的那個客戶,解決了這個問題。
思考之下,作為乙個關鍵的公共服務是不是可以做相應優化來應對這種「客戶」犯下的錯誤。
採用raii機制,把釋放鏈結的那個方法也寫入析構函式中
舉例(採用偽碼加不標準類寫法方式,主要是說明思路;參考effective c++章節2 構造/析構)
class connectionpool
}
void releaseconnection()
private:
bool brelease; (初始化為
false)
};
這樣」客戶「如果是採用棧或智慧型指標例項化的物件來使用服務,即使忘記釋放連線都可以利用raii機制安全釋放;
但是如果」客戶「直接用new出的物件使用服務忘記釋放連線呢,又回到了最先遇到的問題上,在一大推呼叫裡找究竟是誰未釋放連線。繼續解決:
既然現在我們的困擾集中在找違規」客戶「的麻煩上,想想圖書館借書,誰借去了必須把他的名字登記下來,誰誰誰借走了這本書,到時候即使他不還,咱也有辦法找到他讓他給咱還回來。於是我們可以再改造一下這個服務,在每個」客戶「獲得連線時都傳入他的標識然後把這個連線和標識**起來。這樣,哪個」客戶「未釋放連線一目了然了吧,立馬找到他讓他改正。ok,快速解決。
yaocoder
由資料庫連線池想到的 處理他人未釋放的資源
前些日子維護編寫的通訊伺服器時遇到了這麼乙個問題 在通訊伺服器裡有乙個資料庫連線池,為他人提供資料庫連線服務,結果發現在使用過程中連線有時會耗盡,這個問題通過除錯跟蹤發現,有 客戶 在使用資料庫連線時,總是不釋放連線 已提供了釋放連線的方法 其實問題很好解決,找出未釋放連線的那個 客戶 然後按照ge...
由資料庫連線池想到的 處理他人未釋放的資源
前些日子維護編寫的通訊伺服器時遇到了這麼乙個問題 在通訊伺服器裡有乙個資料庫連線池,為他人提供資料庫連線服務,結果發現在使用過程中連線有時會耗盡,這個問題通過除錯跟蹤發現,有 客戶 在使用資料庫連線時,總是不釋放連線 已提供了釋放連線的方法 其實問題很好解決,找出未釋放連線的那個 客戶 然後按照ge...
資料庫連線池 Redis連線池
基本原理 在內部物件池中,維護一定數量的資料庫連線,並對外暴露資料庫連線的獲取和返回方法。如外部使用者可通過getconnection方法獲取資料庫連線,使用完畢後再通過releaseconnection方法將連線返回,注意此時的連線並沒有關閉,而是由連線池管理器 並為下一次使用做好準備。2.作用 ...