日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

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

代碼如下:

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é)果如下:

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

可以看到數(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ù)連接

那么使用這種方式有什么問(wèn)題呢?

首先假設(shè)有一張表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開始執(zhí)行ExecuteCommand

 

ExecuteCommand代碼如下:

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)行:

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

 

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

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

if (conn.State != System.Data.ConnectionState.Open)
    conn.Open();

再次運(yùn)行:

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

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

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)基本沒問(wèn)題了.

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

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

 

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

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

分享到:
標(biāo)簽:關(guān)閉 也有 數(shù)據(jù)庫(kù)連接
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定