最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析為何要關(guān)閉數(shù)據(jù)庫(kù)連接,可不可以不關(guān)閉的問題詳解

 更新時(shí)間:2013年05月13日 11:29:56   作者:  
本篇文章是對(duì)為何要關(guān)閉數(shù)據(jù)庫(kù)連接,可不可以不關(guān)閉的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

首先要說明的是連接數(shù)是有限制的:

代碼如下:

復(fù)制代碼 代碼如下:

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("打開了{(lán)0}個(gè)連接", i);
}


運(yùn)行結(jié)果如下:

image

過一會(huì)就會(huì)提示打開連接超時(shí)了:

clip_image002

 

可以看到數(shù)據(jù)庫(kù)連接時(shí)有限制的,如果連接不關(guān)閉,而且使用的人比較多,那么系統(tǒng)很快就down掉了。

 

但是有時(shí)候由于某些原因應(yīng)用程序可能只是幾個(gè)人使用,所以就有人設(shè)計(jì)了:

在應(yīng)用程序啟動(dòng)的時(shí)候打開數(shù)據(jù)庫(kù)連接,在應(yīng)用程序關(guān)閉的時(shí)候關(guān)閉數(shù)據(jù)庫(kù)連接

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

首先假設(shè)有一張表Nums,表定義如下:

image

Main代碼如下:

復(fù)制代碼 代碼如下:

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開始執(zhí)行ExecuteCommand

ExecuteCommand代碼如下:

復(fù)制代碼 代碼如下:

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

    Thread.Sleep(100);

    SqlCommand cmd = new SqlCommand(
       string.Format("Insert into Nums values('{0}') ", id), conn);

    cmd.ExecuteNonQuery();
}


運(yùn)行:

clip_image002[5]

可以看到ExecuteNonQuery方法拋出了異常,原因是連接處于關(guān)閉狀態(tài)。

 

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

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

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

clip_image002[7]

可以看到還是會(huì)出現(xiàn)連接已關(guān)閉的問題。你知道什么原因嗎?

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

復(fù)制代碼 代碼如下:

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("正在執(zhí)行.." + id);
        Thread.Sleep(100);
        SqlCommand cmd = new SqlCommand(
           string.Format("Insert into Nums values('{0}') ", id), conn);
        cmd.ExecuteNonQuery();
    }
}

再次運(yùn)行:可以發(fā)現(xiàn)基本沒問題了.

修改Parallel.For的最大值上限,要測(cè)試下是否可以長(zhǎng)期執(zhí)行了。

復(fù)制代碼 代碼如下:

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

一天測(cè)試下來,沒出現(xiàn)任何問題。

結(jié)論:對(duì)于某些只有幾個(gè)人使用的應(yīng)用程序,可以不關(guān)閉數(shù)據(jù)庫(kù)連接,但是在寫代碼的時(shí)候最好要加上連接是否打開的判斷。

相關(guān)文章

最新評(píng)論

玉溪市| 伊金霍洛旗| 黎川县| 尼勒克县| 龙川县| 邢台县| 察隅县| 蓬莱市| 沧州市| 望谟县| 丰县| 女性| 浦江县| 家居| 沈阳市| 宣武区| 新乡县| 大理市| 中牟县| 平果县| 八宿县| 喀喇| 工布江达县| 延川县| 柞水县| 青神县| 拉萨市| 花莲市| 万山特区| 武安市| 台南市| 博客| 武平县| 阜平县| 乐陵市| 连城县| 扶风县| 唐山市| 元江| 儋州市| 河南省|