在使用連接池進行數據庫連接時,我們經常會遇到"超時時間已到,但是尚未從池中獲取連接"這個異常。雖然這個異常很難復現,但我們希望能夠全局捕獲該異常,并給出一個友好的提示。但問題是,我們不清楚這個異常屬于哪種類型,有些人說它屬于InvalidOperationException異常。因此我想請教各位大佬們是否有更好的解決辦法。
首先,讓我們來看一下對應的英文錯誤信息:
Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
然而,即使在極端情況下,這種情況仍然會發(fā)生?,F在,我們只是想攔截這個異常并給出一個友好的提示。一種解決辦法是通過Exception.Message進行攔截。
下面是一個示例代碼,展示了如何在全局捕獲該異常并給出友好提示:
public class Sg1ExceptionFilterAttribute : ExceptionFilterAttribute{ public override void OnException(HttpActionExecutedContext actionExecutedContext) { if (actionExecutedContext.Exception is InvalidOperationException || actionExecutedContext.Exception is Sq1Exception) { actionExecutedContext.Response = actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "請稍后重試"); } base.OnException(actionExecutedContext); } }
通過繼承ExceptionFilterAttribute類,我們可以自定義異常過濾器來捕獲特定類型的異常。在上述代碼中,我們判斷異常是否屬于InvalidOperationException或Sq1Exception,如果是,則將響應設為一個帶有"請稍后重試"消息的錯誤響應。最后,調用基類的OnException方法,以確保異常繼續(xù)傳播到其他可能的異常處理程序。
這種方式能夠有效地捕獲并處理該異常,同時給用戶提供了一個友好的提示信息,讓他們知道發(fā)生了連接池超時的情況,并建議稍后重試。
總結一下,對于"超時時間已到,但是尚未從池中獲取連接"這個異常,我們可以通過編寫一個自定義的異常過濾器來全局捕獲并處理該異常。這樣能夠提供更好的用戶體驗,并提示用戶稍后重試。同時,我們也提供了一種通過攔截Exception.Message的解決辦法。
解決思路
一、看所有open的連接是否都close了。
二、如果訪問量很大,加上Max Pool Size=512這一句,當然這是要以損失系統(tǒng)性能為代價的! 這樣以后一定可以解決你的問題!
解決方案
解決方案一
我想原因可能是并發(fā)操作。DataReader是獨占連接的,就是說你的程序可能設計上有問題。比如說最大連接設100,假設有100個人同時使用 DataReader正在讀取數據庫內容,那么當第101人讀取的時候,連接池中的連接已經沒有了,就會出現上面的錯誤。DataReader是獨占連接 的,每個DataReader都要占用一個連接。當然這個情況是偶爾出現的,所以會很長時間出現一次,因為只有同時有超過連接池最大連接數量的并發(fā)操作才會發(fā)生。而且你加大并發(fā)數量只能暫時緩解問題,如果你加大到200個并發(fā)連接,如果有201 人同時操作怎么辦?你說了你使用Connection對象的Close()方法,這是不行的,因為Close()方法僅僅是關閉連接,但這個連接沒有釋放,還是被這個對象占用,要釋放必須使用Connection的Dispose()方法顯式釋放連接才可以,否則這個對象占用的連接只能等到垃圾收集的情 況下才能被釋放。這種情況肯定會出現“超時時間已到”的錯誤。
解決方法
解決方案一
修改幾個關鍵頁面或訪問比較頻繁的數據庫訪問操作,使用DataAdapter和DataSet來獲取數據庫數據,不要使用DataReader。
在訪問數據庫的頁面上使用數據緩存,如果頁面的數據不是經常更新(幾分鐘更新一次)的話,使用Cache對象可以不用訪問數據庫而使用緩存中的內容,那么可以大大減少連接數量。
修改代碼,把使用Connection對象的地方都在Close()后面加上Dispose()調用。
建議對數據庫操作進行大的修改,建立自己的數據庫操作代理類,繼承
System.IDisposable接口,強迫釋放資源,這樣就不會出現連接數量不夠的問題了。
解決方案二
WEB.config 里面:在數據庫連接加 Max Pool Size = 512;server=local;uid=;pwd=;database=2004;Max Pool Size = 512;">一勞永逸。 解決方案三文章來源:http://www.zghlxwxcb.cn/article/646.html
估計是連接(Connection)對象沒有Close。倒是不必Dispose,而DataReader用完后應該關閉,但不關閉也沒問題,只是不關閉的話此連接對象就一直不能用,只要你最終關閉了連接對象就不會出問題。 連接對象在Open后的操作都放在try塊中,后面跟一個finally塊:conn.Close();文章來源地址http://www.zghlxwxcb.cn/article/646.html
到此這篇關于超時時間已到,但是尚未從池中獲取連接異常捕獲及解決辦法的文章就介紹到這了,更多相關內容可以在右上角搜索或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!