当前位置:  编程技术>.net/c#/asp.net

解析如何正确使用SqlConnection的实现方法

    来源: 互联网  发布时间:2014-10-20

    本文导语:  以前曾见过有人这样写代码: 代码如下:public class Service1 : IService1    {        private SqlConnection conn = new SqlConnection();        public void Method1()        {            //do something with conn;        }        public vo...

以前曾见过有人这样写代码:
代码如下:

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;
        }
    }

在服务类中,新建一个全局的conn对象,然后使用conn对象来操作数据库。
当然,还有一些不同的版本,比如:
代码如下:

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

如果有人问你哪种方式比较好,你会怎么回答?
 
首先验证下在多线程环境下使用一个Connection的方式:
创建控制台程序:
Main代码如下:
代码如下:

public static void Main()
{
    string connectionString = @"Data Source=.SQLEXPRESS;
                                AttachDbFilename=""E:DBNORTHWND.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); //模拟耗时的查询
    conn.Close();
    Console.WriteLine("Thread:{0} 执行完毕,{1}", Thread.CurrentThread.Name, DateTime.Now);
}

代码很简单,模拟两个线程同时执行ExecuteCommand.方法。结果如下:

 

可以知道在多线程环境下使用一个Connection来执行Sql语句是不安全的,

修改Main函数如下:将一个Connection,改为多个Connection

代码如下:

public static void Main()
{
    string connectionString = @"Data Source=.SQLEXPRESS;
                                AttachDbFilename=""E:DBNORTHWND.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();
}

运行结果如下:

既然多个Connection比一个Connection要好,

为什么还是有人使用上面的那种写法来创建Connection呢?

我认为他们可能会认为创建多个Connection比较耗时,而且多个Connection会占用内存,影响性能等等。。

在这一点上可以使用测试数据来说明:

测试数据来自: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 ,未启用数据库连接池

CP :Connection Pool,启用数据库连接池

OC :One Connection,一个连接对象

从图表可以发现启用了连接池的方式并不比重用一个连接慢多少。

但是从稳定性,程序的健壮性来说,CP的方式明显的好于OC。

所以下次实现服务,或者是查询的时候完全可以使用

代码如下:

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

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

    
 
 

您可能感兴趣的文章:

  • php通过pack和unpack函数实现对二进制数据封装及解析
  • linux下用C编程实现域名解析!
  • 如何实现bind下的域名解析分级
  • bind9架设内部dns+硬件防火墙端口映射,不能实现域名解析
  • 开发板域名解析DNS如何实现呢?
  • 用Javascript正则实现url链接的解析类
  • Lua解析器的JS实现 Emscripten
  • 解析如何用指针实现整型数据的加法
  • java实现网页解析示例
  • linux 多线程实现域名解析的问题!
  • 纯C语言实现的HTML5解析库 Gumbo
  • ARM开发怎么实现域名解析呢,ARM板能ping通IP,不能ping通域名?
  • python实现dnspod自动更新dns解析的方法
  • 解析在WTL下使用双缓冲的实现方法
  • 解析如何用两个栈来实现队列的方法
  • java实现将域名解析成ip示例
  • 基于Android XML解析与保存的实现
  • 解析分别用递归与循环的方式求斐波那契数列的实现方法
  • C++实现判断字符串是否回文实例解析
  • 先序遍历二叉树的递归实现与非递归实现深入解析
  • 解析c#显示友好时间的实现代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 请教redhat9下什么命令执行arp解析和逆向arp解析
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 如何用libxml2 默认解析器解析HTML文件
  • 基于Python的Html/xml解析库Beautiful Soup 4.2.1发布
  • linux能否成为动态域名解析客户端的动态域名解析服务器?
  • html中<radio>单选按钮控件标签用法解析及如何设置默认选中
  • 配置DNS服务器后,服务器可解析,客户端不能解析。求解
  • Python下Html/xml解析库Beautiful Soup快速入门教程
  • 为什么我在使用nslookup命令的时候,正向解析(域名-》ip)没有问题,反向解析(ip-》域名)怎么查不到呢?
  • 基于Python的html解析库:pyquery最新版主页及pyquery下载
  • 服务器本机能解析域名,其它机子都解析不到,能ping通dns服务器地址,是什么问题?//
  • python下xml解析库lxml最新版下载安装以及代码示例
  • 我有一个DNS服务器,既要解析自己局域网里IP,有要解析外网上的IP,如www.163.com,我该如何设置呢
  • python对XML的解析方法(SAX,DOM,ElementTree)介绍
  • 请问怎样手工的解析XML文件啊.( 不借助任何的xml解析器)急!!!
  • html中<checkbox>标签用法解析及如何设置checkbox复选框的默认选中状态
  • 通过shell解析文件,并根据解析内容生成新的文件。
  • html中<select>标签用法解析及如何设置select的默认选中状态
  • java 公式解析 表达式解析 expression-analyzer
  • 请问各位:我用SUN公司的JAXP开发包解析XML文档,可不知道对XML解析后如何将结果写回文件中。请各位熟悉Java和XML的高手帮忙。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3