多年來,我在連接到SQL服務器的所有Web應用程序中遇到了非常奇怪的問題。SQL Server連接池不檢測關閉的連接?
的問題是,如果事情發生在數據庫服務器(服務器重啓或其它問題),德web應用程序停止從該點工作,即使數據庫服務器是活得很好之後。
會發生什麼情況是,每一個ADO.NET操作(的ExecuteNonQuery,CreateReader,的BeginTransaction,...)失敗,出現InvalidOperationException異常: 「操作無效的連接被關閉」。看來,到SqlConnection.Open()的調用檢索來自應用程序池被關閉......連接!
根據該文件,連接池應自動刪除切斷連接池中的連接,但apparantly關閉的連接不被視爲「切斷」,所以調用SqlConnection.Open()愉快地返回關閉連接,假設它是打開的,而不檢查它。
我目前的解決辦法是打開後立即檢查連接的狀態:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
if (connection.State != ConnectionState.Open)
{
SqlConnection.ClearAllPools();
connection.Open();
}
// ...
}
這種解決方法似乎對於現在的工作,但我不覺得舒服這樣做。
所以我的問題是:
- 爲什麼SqlConnection.Open()回報關閉連接池中的連接?
- 我的解決方法是否有效?
- 有沒有更好的方法來處理這個問題?
我可以忍受「幾分鐘」,但使用連接時,顯然會引發異常,但連接池中的「壞」連接永遠保持可用狀態。它永遠不會被刪除,儘管ADO.NET確實會拋出異常,因爲連接不好。 –