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

解析如何正確使用SqlConnection的實(shí)現(xiàn)方法

 更新時(shí)間:2013年05月13日 16:44:38   作者:  
本篇文章對(duì)如何正確使用SqlConnection的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
以前曾見過有人這樣寫代碼:
復(fù)制代碼 代碼如下:

public class Service1 : IService1
    {
        private SqlConnection conn = new SqlConnection();
        public void Method1()
        {
            //do something with conn;
        }
        public void Method2()
        {
            //do something with conn;
        }
        public void Method3()
        {
            //do something with conn;
        }
        public void Method4()
        {
            //do something with conn;
        }
    }

在服務(wù)類中,新建一個(gè)全局的conn對(duì)象,然后使用conn對(duì)象來操作數(shù)據(jù)庫(kù)。
當(dāng)然,還有一些不同的版本,比如:
復(fù)制代碼 代碼如下:

private SqlConnection conn = new SqlConnection();
private static SqlConnection sconn = new SqlConnection();
private SqlConnection Conn
{
    get { return new SqlConnection(); }
}

如果有人問你哪種方式比較好,你會(huì)怎么回答?
 
首先驗(yàn)證下在多線程環(huán)境下使用一個(gè)Connection的方式:
創(chuàng)建控制臺(tái)程序:
Main代碼如下:
復(fù)制代碼 代碼如下:

public static void Main()
{
    string connectionString = @"Data Source=.\SQLEXPRESS;
                                AttachDbFilename=""E:\DB\NORTHWND.mdf"";
                                Integrated Security=True;
                                Connect Timeout=30;User Instance=True";
    string connectionStringNoPooling = connectionString + " ;Pooling='false' ";
    SqlConnection conn = new SqlConnection(connectionString);
    new Thread(() => { ExecuteCommand(conn); }) { Name = "t1" }.Start();
    new Thread(() => { ExecuteCommand(conn); }) { Name = "t2" }.Start();
}
public static void ExecuteCommand(SqlConnection conn)
{
    Console.WriteLine("Thread:{0},{1}", Thread.CurrentThread.Name, DateTime.Now);

    conn.Open();

    SqlCommand command = new SqlCommand("select * from customers", conn);
    command.ExecuteNonQuery();
    command.Dispose();
    Thread.Sleep(5000); //模擬耗時(shí)的查詢
    conn.Close();
    Console.WriteLine("Thread:{0} 執(zhí)行完畢,{1}", Thread.CurrentThread.Name, DateTime.Now);
}

代碼很簡(jiǎn)單,模擬兩個(gè)線程同時(shí)執(zhí)行ExecuteCommand.方法。結(jié)果如下:

image

 

可以知道在多線程環(huán)境下使用一個(gè)Connection來執(zhí)行Sql語(yǔ)句是不安全的,

修改Main函數(shù)如下:將一個(gè)Connection,改為多個(gè)Connection

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

public static void Main()
{
    string connectionString = @"Data Source=.\SQLEXPRESS;
                                AttachDbFilename=""E:\DB\NORTHWND.mdf"";
                                Integrated Security=True;
                                Connect Timeout=30;User Instance=True";
    string connectionStringNoPooling = connectionString + " ;Pooling='false' ";
    //SqlConnection conn = new SqlConnection(connectionString);
    //new Thread(() => { ExecuteCommand(conn); }) { Name = "t1" }.Start();
    //new Thread(() => { ExecuteCommand(conn); }) { Name = "t2" }.Start();
    SqlConnection conn1 = new SqlConnection(connectionString);
    SqlConnection conn2 = new SqlConnection(connectionString);
    new Thread(() => { ExecuteCommand(conn1); }) { Name = "t1" }.Start();
    new Thread(() => { ExecuteCommand(conn2); }) { Name = "t2" }.Start();
    Console.ReadLine();
}

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

image

既然多個(gè)Connection比一個(gè)Connection要好,

為什么還是有人使用上面的那種寫法來創(chuàng)建Connection呢?

我認(rèn)為他們可能會(huì)認(rèn)為創(chuàng)建多個(gè)Connection比較耗時(shí),而且多個(gè)Connection會(huì)占用內(nèi)存,影響性能等等。。

在這一點(diǎn)上可以使用測(cè)試數(shù)據(jù)來說明:

測(cè)試數(shù)據(jù)來自:Connection-Pooling vs. Reusing one connection

Run #

NCP

CP

OC

1

4073

374

237

2

4032

341

298

3

3985

353

242

4

4085

348

269

5

3964

369

256

6

4203

330

207

7

4055

341

359

8

4071

357

286

9

3968

363

356

10

4023

349

359

AVG

4046

353

287

 

Run #:1代表1000次查詢,2代表2000次查詢

NCP :Not Connection Pool ,未啟用數(shù)據(jù)庫(kù)連接池

CP :Connection Pool,啟用數(shù)據(jù)庫(kù)連接池

OC :One Connection,一個(gè)連接對(duì)象

從圖表可以發(fā)現(xiàn)啟用了連接池的方式并不比重用一個(gè)連接慢多少。

但是從穩(wěn)定性,程序的健壯性來說,CP的方式明顯的好于OC。

所以下次實(shí)現(xiàn)服務(wù),或者是查詢的時(shí)候完全可以使用

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

public SqlConnection Connection
{
    get
    {
        return new SqlConnection(@"...");
    }
}

而不要
private SqlConnection conn = new SqlConnection(connectionString);

相關(guān)文章

  • C#程序終極調(diào)試實(shí)現(xiàn)windbg的時(shí)間旅行

    C#程序終極調(diào)試實(shí)現(xiàn)windbg的時(shí)間旅行

    這篇文章主要介紹了C#程序終極調(diào)試實(shí)現(xiàn)windbg的時(shí)間旅行示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Unity后處理效果之邊角壓暗

    Unity后處理效果之邊角壓暗

    這篇文章主要為大家詳細(xì)介紹了Unity后處理效果之邊角壓暗,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C#使用Sleep(Int32)方法實(shí)現(xiàn)動(dòng)態(tài)顯示時(shí)間

    C#使用Sleep(Int32)方法實(shí)現(xiàn)動(dòng)態(tài)顯示時(shí)間

    這篇文章主要為大家詳細(xì)介紹了C#如何使用Sleep(Int32)方法實(shí)現(xiàn)動(dòng)態(tài)顯示時(shí)間,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2024-01-01
  • C#面向?qū)ο缶幊讨薪涌诟綦x原則的示例詳解

    C#面向?qū)ο缶幊讨薪涌诟綦x原則的示例詳解

    在面向?qū)ο缶幊讨?,SOLID?是五個(gè)設(shè)計(jì)原則的首字母縮寫,旨在使軟件設(shè)計(jì)更易于理解、靈活和可維護(hù)。本文將通過實(shí)例詳細(xì)講講C#面向?qū)ο缶幊讨薪涌诟綦x原則,需要的可以參考一下
    2022-07-07
  • C#事件用法實(shí)例淺析

    C#事件用法實(shí)例淺析

    這篇文章主要介紹了C#事件用法,以實(shí)例形式分析了C#中事件的定義、觸發(fā)及處理相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C#判斷一個(gè)矩陣是否為對(duì)稱矩陣及反稱矩陣的方法

    C#判斷一個(gè)矩陣是否為對(duì)稱矩陣及反稱矩陣的方法

    這篇文章主要介紹了C#判斷一個(gè)矩陣是否為對(duì)稱矩陣及反稱矩陣的方法,涉及C#矩陣遍歷及檢查等相關(guān)運(yùn)算技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#中event內(nèi)存泄漏總結(jié)

    C#中event內(nèi)存泄漏總結(jié)

    本篇文章給大家分享了在C#中event內(nèi)存泄漏的相關(guān)知識(shí)點(diǎn)以及代碼分享,有興趣的朋友參考學(xué)習(xí)下。
    2018-03-03
  • C#中倒序輸出字符串的方法示例

    C#中倒序輸出字符串的方法示例

    這篇文章主要給大家介紹了C#中倒序輸出字符串的方法示例,本文中的字符串倒序指的是將“嗎? 好 近 最”輸出“最 近 好 嗎?”,文中給出了兩種方法,需要的朋友可以參考借鑒,下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-01-01
  • 基于Avalonia實(shí)現(xiàn)自定義彈窗的示例詳解

    基于Avalonia實(shí)現(xiàn)自定義彈窗的示例詳解

    對(duì)于使用avalonia的時(shí)候某些功能需要到一些提示,比如異常或者成功都需要對(duì)用戶進(jìn)行提示,所以需要單獨(dú)實(shí)現(xiàn)彈窗功能,并且可以自定義內(nèi)部組件,這一期將手動(dòng)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的小彈窗,并且很容易自定義,希望大家喜歡
    2023-02-02
  • C#判斷單詞個(gè)數(shù)方法總結(jié)

    C#判斷單詞個(gè)數(shù)方法總結(jié)

    我們給大家總計(jì)了C#中判斷英文單詞個(gè)數(shù)的方法以及排序的技巧,對(duì)此有需要的朋友可以測(cè)試下。
    2018-03-03

最新評(píng)論