? ? ? ?相信很多人都會好奇會為什么一定要關閉數據庫連接呢?我們可不可以不關閉數據庫連接?現在小編為你分享要關閉數據庫連接的原因解析吧。
? ? ? ?首先要說明的是連接數是有限制的:
代碼如下:
?
??? conn.Open();
??? Console.WriteLine("打開了{0}個連接", i);
}
運行結果如下:
? ? ? ?過一會就會提示打開連接超時了:
? ? ? ?可以看到數據庫連接時有限制的,如果連接不關閉,而且使用的人比較多,那么系統很快就down掉了。
? ? ? ?但是有時候由于某些原因應用程序可能只是幾個人使用,所以就有人設計了:
? ? ? ?在應用程序啟動的時候打開數據庫連接,在應用程序關閉的時候關閉數據庫連接
? ? ? ?那么使用這種方式有什么問題呢?
? ? ? ?首先假設有一張表Nums,表定義如下:
? ? ? ?Main代碼如下:
? ? ? ?就是從1到9999開始執行ExecuteCommand
?
ExecuteCommand代碼如下:
?
??? Thread.Sleep(100);
??? SqlCommand cmd = new SqlCommand(
?????? string.Format("Insert into Nums values('{0}') ", id), conn);
??? cmd.ExecuteNonQuery();
}
? ? ? ?運行:
? ? ? ?可以看到ExecuteNonQuery方法拋出了異常,原因是連接處于關閉狀態。
? ? ? ?可是我們的連接一直都是open著的啊,并沒有調用close,dispose之類的方法啊。
? ? ? ?于是在ExecuteCommand前面增加判斷條件:
if (conn.State != System.Data.ConnectionState.Open)
??? conn.Open();再次運行:
? ? ? ?可以看到還是會出現連接已關閉的問題。你知道什么原因嗎?
? ? ? ?這里是由于多線程環境引起的。所以需要加鎖。
? ? ? ?再次運行:可以發現基本沒問題了.
? ? ? ?修改Parallel.For的最大值上限,要測試下是否可以長期執行了。
一天測試下來,沒出現任何問題。
結論:對于某些只有幾個人使用的應用程序,可以不關閉數據庫連接,但是在寫代碼的時候最好要加上連接是否打開的判斷。
? ? ? ?上文是關于要關閉數據庫連接的原因解析,相信大家都有了一定的了解,想要了解更多的技術信息,請繼續關注武林技術頻道吧!
新聞熱點
疑難解答
圖片精選