2012-10-19 101 views
0

我在網站中得到了以下例外,這在很大程度上處理數據錄入操作。它還具有在關聯數據庫的表中定義的索引。數據庫調用通過SQLHelper進行。對於例如SQLHelper.ExecuteNonQuery()等我看不到任何Close()Dispose()方法的SQLConnection被調用。所以我認爲SQLHelper必須照顧它,因爲我也在各個網站上閱讀了它。此外,檢查與Close()Dispose()結合使用的代碼也非常繁瑣,因爲SQLHelper在很多地方使用,並且有許多類定義了業務邏輯。我得到的例外是:SQL Server數據庫連接池?

該記錄未更新超時過期。在從池中獲取連接之前已超時。發生這種情況的原因可能是因爲所有連接池都在使用中,並且達到最大池大小。

現在我已經測試過的代碼把GC.CollectGlobal.asaxApplication_EndRequest方法,一切以現在工作正常。但我知道嚴格不建議使用相同的。

任何幫助,將不勝感激,因爲我堅持@本..

+0

我已經更新了我的答案 –

回答

0

不知道哪個您提供SQLHelper的版本,但如果你看不到任何的Connection.close()被調用,那麼您需要手動調用它來確保連接關閉。垃圾收集器不會爲您關閉連接。

編輯

兼談池是由淨本身默認啓用的連接,你可以調用connection.close()時,並不意味着你的應用程序到SQL Server真的被關閉之間的連接,它只是迴歸該連接返回到連接池並等待其他人抓取。只有在一段時間後,沒有人打開新的連接,連接纔會被關閉,所以你不需要擔心連接的問題。關閉()太多次了,而不是你需要儘快調用它來釋放其他資源線程使用。

欲瞭解更多詳情請查看微軟怎麼說關於連接池:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

ANOTHER編輯 我建議你找提供SQLHelper的更新版本,也可以繼續改變提供SQLHelper增收()在它。即使你發現GC幫助你關閉了連接,但你不應該這樣使用它,GC並不是用於釋放數據庫連接,而是爲了釋放數據庫連接而設計的,GC.Collect()並不能保證它立即立即開始垃圾處理採集。

而且你編碼的Web應用程序,所以你需要考慮的併發性,如果什麼,當你調用GC.Collect的()另一個線程運行時,將你的系統慢下來給其他用戶?

這是一個常識,這些有限的資源(如數據庫連接,TCP/IP端口,文件讀/寫處理器等)需要儘快釋放成爲可能。如果你正在尋找一種簡單的方法,讓你甚至不需要使用的Connection.close那麼你將一個錯誤的方向容易編碼,我知道你想你簡單代碼,而不是到處添加行,但你至少需要確保提供SQLHelper完成工作來關閉連接。

+0

Simon因爲定義了業務邏輯的類很多,所以很難將無處不在應用close方法。我還在db上運行了SQL Profiler,發現有關的連接確實已被重置,但我不知道爲什麼它們不可用。此外,我執行了sproc viz sp_who,發現許多連接確實處於睡眠狀態,並且隨着每次數據庫調用它們都會不斷增加。相反,當我在Application_EndRequest中放置GC.Collect()時,發現睡眠連接已經消失,並且儘管達到了最大池大小,錯誤仍未到來。 – Programmer

+0

Simon,SQL Helper的版本如下:公共密封類SqlHelper 名稱:Microsoft.ApplicationBlocks.Data.SqlHelper 程序集:Microsoft.ApplicationBlocks.Data,Version = 1.0.1727.33524。 – Programmer

+0

Kunal,我想我們現在可能只是稍微偏離主題,也許你應該在這裏粘貼你的代碼。順便說一句,如果你正在使用DataReader,但你不關閉讀者,你可能會用盡連接。 –