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

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

 更新時(shí)間:2013年05月13日 16:44:38   作者:  
本篇文章對(duì)如何正確使用SqlConnection的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
以前曾見(jiàn)過(guò)有人這樣寫(xiě)代碼:
復(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ì)象來(lái)操作數(shù)據(jù)庫(kù)。
當(dāng)然,還有一些不同的版本,比如:
復(fù)制代碼 代碼如下:

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

如果有人問(wèn)你哪種方式比較好,你會(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來(lái)執(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要好,

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

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

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

測(cè)試數(shù)據(jù)來(lái)自: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)定性,程序的健壯性來(lái)說(shuō),CP的方式明顯的好于OC。

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

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

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

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

相關(guān)文章

最新評(píng)論

安仁县| 林西县| 合江县| 襄樊市| 华池县| 石阡县| 图木舒克市| 乃东县| 长丰县| 镇巴县| 镇江市| 陇南市| 榕江县| 延安市| 通道| 绥化市| 民县| 嵩明县| 寿宁县| 张掖市| 郁南县| 浦城县| 东平县| 芮城县| 大理市| 菏泽市| 和田市| 西乡县| 集贤县| 延吉市| 织金县| 黑山县| 临高县| 屏东县| 鄂州市| 丹寨县| 罗城| 修水县| 宜川县| 南和县| 仁化县|