亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

首先要說明的是連接數(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("打開了{0}個連接", i);
}


運行結(jié)果如下:

image

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

clip_image002

 

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

 

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

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

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

首先假設(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();
}


運行:

clip_image002[5]

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

 

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

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

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

clip_image002[7]

可以看到還是會出現(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();
    }
}

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

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

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

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

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

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

相關(guān)文章

  • C++生成dll和調(diào)用dll的方法實例

    C++生成dll和調(diào)用dll的方法實例

    C++生成dll和調(diào)用dll的方法實例,需要的朋友可以參考一下
    2013-03-03
  • VC實現(xiàn)屏幕截詞功能的方法詳解

    VC實現(xiàn)屏幕截詞功能的方法詳解

    這篇文章主要介紹了VC實現(xiàn)屏幕截詞功能的方法詳解,對于深入的理解windows程序運行原理很有幫助,需要的朋友可以參考下
    2014-07-07
  • C語言直接插入排序算法

    C語言直接插入排序算法

    大家好,本篇文章主要講的是C語言直接插入排序算法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++中的STL中map用法詳解(零基礎(chǔ)入門)

    C++中的STL中map用法詳解(零基礎(chǔ)入門)

    map在編程中是經(jīng)常使用的一個容器,本文來講解一下STL中的map,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語言字符串左旋的兩種實現(xiàn)方法

    C語言字符串左旋的兩種實現(xiàn)方法

    匯編語言中有一種移位指令叫做循環(huán)左移(ROL),下面這篇文章主要給大家介紹了關(guān)于C語言字符串左旋的兩種實現(xiàn)方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • C++枚舉類型用法總結(jié)(枚舉字符常量代替常量)

    C++枚舉類型用法總結(jié)(枚舉字符常量代替常量)

    這篇文章主要介紹了C++枚舉類型用法總結(jié)(枚舉字符常量代替常量),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C++實現(xiàn)圖書管理程序

    C++實現(xiàn)圖書管理程序

    這篇文章主要為大家詳細介紹了C++實現(xiàn)圖書管理程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • linux C++ 獲取文件絕對路徑的實例代碼

    linux C++ 獲取文件絕對路徑的實例代碼

    下面小編就為大家?guī)硪黄猯inux C++ 獲取文件絕對路徑的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • opencv實現(xiàn)圖像平移

    opencv實現(xiàn)圖像平移

    這篇文章主要為大家詳細介紹了opencv實現(xiàn)圖像平移,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言函數(shù)的遞歸和調(diào)用實例分析

    C語言函數(shù)的遞歸和調(diào)用實例分析

    一個函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。這種函數(shù)稱為遞歸函數(shù)。C語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進入新的一層
    2013-07-07

最新評論