麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

要關閉數據庫連接的原因解析

2020-02-24 14:32:10
字體:
來源:轉載
供稿:網友

? ? ? ?相信很多人都會好奇會為什么一定要關閉數據庫連接呢?我們可不可以不關閉數據庫連接?現在小編為你分享要關閉數據庫連接的原因解析吧。

? ? ? ?首先要說明的是連接數是有限制的:

代碼如下:

?

for (int i = 0; i < 10000; i++)
{
??? SqlConnection conn = new SqlConnection(@"Data Source=./SQLEXPRESS;
??????????????? AttachDbFilename=""E:/DB/NORTHWND.mdf"";
??????????????? Integrated Security=True;Connect Timeout=30;User Instance=True");

?

??? conn.Open();
??? Console.WriteLine("打開了{0}個連接", i);
}


運行結果如下:

image

? ? ? ?過一會就會提示打開連接超時了:

? ? ? ?可以看到數據庫連接時有限制的,如果連接不關閉,而且使用的人比較多,那么系統很快就down掉了。

? ? ? ?但是有時候由于某些原因應用程序可能只是幾個人使用,所以就有人設計了:

? ? ? ?在應用程序啟動的時候打開數據庫連接,在應用程序關閉的時候關閉數據庫連接

? ? ? ?那么使用這種方式有什么問題呢?

? ? ? ?首先假設有一張表Nums,表定義如下:

? ? ? ?Main代碼如下:

?

SqlConnection conn = new SqlConnection(@"Data Source=./SQLEXPRESS;
??????????????????? AttachDbFilename=""E:/DB/NORTHWND.mdf"";
??????????????????? Integrated Security=True;Connect Timeout=30;User Instance=True");
conn.Open();
Parallel.For(1, 9999, (id) =>
{
??? ExecuteCommand(conn, id);
});


? ? ? ?就是從1到9999開始執行ExecuteCommand

?

ExecuteCommand代碼如下:

?

private static void ExecuteCommand(SqlConnection conn, int id)
{
??? Console.WriteLine("正在執行." + id);

?

??? 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();再次運行:

? ? ? ?可以看到還是會出現連接已關閉的問題。你知道什么原因嗎?

? ? ? ?這里是由于多線程環境引起的。所以需要加鎖。

?

private static object syncObj = new object();
private static void ExecuteCommand(SqlConnection conn, int id)
{
??? lock (syncObj)
??? {
??????? if (conn.State != System.Data.ConnectionState.Open)
??????????? conn.Open();
??????? Console.WriteLine("正在執行.." + id);
??????? Thread.Sleep(100);
??????? SqlCommand cmd = new SqlCommand(
?????????? string.Format("Insert into Nums values('{0}') ", id), conn);
??????? cmd.ExecuteNonQuery();
??? }
}


? ? ? ?再次運行:可以發現基本沒問題了.

? ? ? ?修改Parallel.For的最大值上限,要測試下是否可以長期執行了。


Parallel.For(1, Int32.MaxValue, (id) =>
??????????? {
??????????????? ExecuteCommand(conn, id);
??????????? });

一天測試下來,沒出現任何問題。

結論:對于某些只有幾個人使用的應用程序,可以不關閉數據庫連接,但是在寫代碼的時候最好要加上連接是否打開的判斷。

? ? ? ?上文是關于要關閉數據庫連接的原因解析,相信大家都有了一定的了解,想要了解更多的技術信息,請繼續關注武林技術頻道吧!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 国产成人av在线播放 | 日本羞羞的午夜电视剧 | 国产乱淫av片免费网站 | 国产一区二区三区影视 | 在线1区| 性生活视频软件 | 中国黄色一级生活片 | 日本一区二区久久久 | 国产91av视频 | teensexhd| 国产精品99久久久久久宅女 | 国产美女视频一区二区三区 | 欧美一级毛片美99毛片 | 永久久久 | 国产1区在线观看 | 国产99精品在线 | 久久这| 182tv成人福利视频免费看 | 在线看一区二区三区 | 国产一区二区三区网站 | 欧美精品一级片 | 成人福利软件 | 久久久久久久久久网 | 国产精品视频一区二区三区综合 | 久久久久久麻豆 | 久草在线免费资源站 | 国产一区二区高清在线 | 欧美三级欧美成人高清www | 日日鲁夜夜视频热线播放 | 免费黄色在线 | 国产精品视频专区 | 久久国产精品二国产精品 | 主人在调教室性调教女仆游戏 | 欧美粗暴analvideos | 欧美精品日日鲁夜夜添 | 亚洲网站免费看 | 亚洲午夜在线视频 | 国产伊人色 | 亚洲看片网 | 久久久久久久久久综合 | 亚洲日韩精品欧美一区二区 |