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

首頁 > 編程 > C > 正文

解析為何要關閉數據庫連接,可不可以不關閉的問題詳解

2020-01-26 16:14:54
字體:
來源:轉載
供稿:網友

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

代碼如下:

復制代碼 代碼如下:

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

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

clip_image002

 

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

 

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

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

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

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

image

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();
}


運行:

clip_image002[5]

可以看到ExecuteNonQuery方法拋出了異常,原因是連接處于關閉狀態。

 

可是我們的連接一直都是open著的啊,并沒有調用close,dispose之類的方法啊

于是在ExecuteCommand前面增加判斷條件:

if (conn.State != System.Data.ConnectionState.Open)
    conn.Open();再次運行:

clip_image002[7]

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

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

復制代碼 代碼如下:

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);
            });

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

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

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

圖片精選

主站蜘蛛池模板: 九草网 | 国产精品视频成人 | 国产在线中文 | h视频在线观看免费 | 国产亚洲精品久久久久久大师 | 亚洲午夜精选 | 九九热视频在线免费观看 | 毛片在线看免费 | 国产精品一区二av18款 | 国产精品视频一区二区三区四区五区 | 日本羞羞的午夜电视剧 | 99精品国产视频 | 亚州综合一区 | 成人 日韩 | 日本精品婷婷久久爽一下 | 成人羞羞在线观看网站 | 91在线免费观看 | 精品国产一区二区三区在线观看 | 久久国产免费 | 日韩精品dvd | 一级做a爱片久久毛片a高清 | 亚洲九草| hdjapanesemassagehd日本 | 久久久久久久久久久久久久av | 久久久久久久免费精品 | 一本在线高清码电影 | 国产精品美女久久久久久不卡 | 嗯哈~不行好大h双性 | 免费看操片 | av在线一区二区三区四区 | 中文字幕在线成人 | 在线小视频国产 | 国av在线| 九草在线 | 久草视频免费 | 精品在线观看一区 | 日韩午夜片 | 亚洲精品3| 久久精品亚洲国产奇米99 | 国产精品野外av久久久 | 黄视频网站免费观看 |