如何正确使用SqlConnection

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

 

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:\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); //模拟耗时的查询
    conn.Close();
    Console.WriteLine("Thread:{0} 执行完毕,{1}", Thread.CurrentThread.Name, DateTime.Now);
}
 

 

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

image

 

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

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

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

 

运行结果如下:

image

既然多个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);

转载于:https://www.cnblogs.com/LoveJenny/archive/2011/10/31/2229738.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远控免杀专题 14 ---AVIator

0x01 免杀能力一览表 几点说明: 1、上表中标识 √ 说明相应杀毒软件未检测出病毒,也就是代表了Bypass。 2、为了更好的对比效果,大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

【Web开发】级联查询(Ajax/ jQuery/ Servlet)

实现级联查询 共有两个下拉框&#xff0c;第一级为学院&#xff0c;第二级为学院开设的科目。 实现的功能为&#xff1a;当改变学院的选择&#xff0c;第二级下拉框需变为对应学院开设的科目内容。 结果预览&#xff1a; jsp页面 <% page contentType"text/html;…

远控免杀专题(15)-DKMC免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

SQL——以面向集合的思维方式来思考

本文来自&#xff1a;http://www.ituring.com.cn/article/details/472 为了以有趣的方式更好地帮助你形成面向集合的思维方式&#xff0c;我将给出自己最喜欢的游戏之一——集合。你可以在线玩这个游戏&#xff0c;网址是www.setgame.com/puzzle/set.htm&#xff0c;每天都会贴…

远控免杀专题(16)-Unicorn免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

【汇编语言】乘法(MUL/IMUL)

乘法&#xff08;MUL/IMUL&#xff09; 目录乘法&#xff08;MUL/IMUL&#xff09;IMUL(signed multiply)有符号数乘法MUL(unsigned multiply)无符号数乘法麻&#xff01;属实是被这个有符号乘法给整麻了&#xff0c;教材就一行例子直接不解释了&#xff0c;关于标志位溢出的一…

eclipse快捷键

Java开发工具(Eclipse的视窗和视图概述) A:视窗 每一个基本的窗体被称为视窗 PackageExplorer 显示项目结构&#xff0c;包&#xff0c;类&#xff0c;及资源Outline 显示类的结构&#xff0c;方便查找&#xff0c;识别&#xff0c;修改Console 程序运行的结果在该窗口显示Hie…

【汇编语言】除法(DIV/IDIV)

除法&#xff08;DIV/IDIV&#xff09; 目录除法&#xff08;DIV/IDIV&#xff09;DIV(unsigned divide)无符号数除法IDIV(signed divide)有符号数除法DIV(unsigned divide)无符号数除法 格式&#xff1a;DIV SRC 操作&#xff1a; SRCSRCSRC为字节时&#xff0c;(AL)←(AX)/…

远控免杀专题(17)-Python-Rootkit免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

斜视角的讨论(转)

http://school.ogdev.net/listshow.asp?page4&typeid0&categoryid5&id0&ListType2 目 录 1.1 地图和地表 1.2 斜视角游戏中的视角 1.3 Tile图片的拼接 1.4 不同地表间的过渡 1.5 地图数据结构的定义 --------------------------------------------------…

计算机网络(湖科大教书匠)

计算机网络&#xff08;湖科大教书匠&#xff09; 本文档为教学视频【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;_哔哩哔哩_bilibili】的摘录 目录计算机网络&#xff08;湖科大教书匠&#xff09;一、绪论1.2 因特网概述1.2.1 网络、互连网&#xff08;互联…

远控免杀专题(18)-ASWCrypter免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

Direct3D中的绘制(3)

立方体——只比三角形稍微复杂一点&#xff0c;这个程序渲染一个线框立方体。 这个简单的绘制和渲染立方体的程序的运行结果如下图所示&#xff1a; 源程序&#xff1a; /************************************************************************************** Renders a …

远控免杀专题(19)-nps_payload免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

操作系统中的多级队列调度

多级队列调度 (Multilevel queue scheduling) Every algorithm supports a different class of process but in a generalized system, some process wants to be scheduled using a priority algorithm. While some process wants to remain in the system (interactive proce…

借助格式化输出过canary保护

0x01 canary保护机制 栈溢出保护是一种缓冲区溢出攻击缓解手段&#xff0c;当函数存在缓冲区溢出攻击漏洞时&#xff0c;攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后&#xff0c;函数开始执行的时候会先往栈里插入cookie信息&#xff0c;当函数真…

各抓包软件的之间差异_系统软件和应用程序软件之间的差异

各抓包软件的之间差异什么是软件&#xff1f; (What is Software?) Software is referred to as a set of programs that are designed to perform a well-defined function. A program is a particular sequence of instructions written to solve a particular problem. 软件…

ret2shellcdoe

ret2shellcode的关键是找到一个缓冲区&#xff0c;这个缓冲区是可读写写可执行的&#xff0c;我们要想办法把我们的shellcdoe放到这个缓冲区&#xff0c;然后跳转到我们的shellcode处执行。 例子&#xff1a; #include <stdio.h> #include <string.h> char str1[…

远控免杀专题(20)-GreatSCT免杀

转载&#xff1a;https://mp.weixin.qq.com/s/s9DFRIgpvpE-_MneO0B_FQ 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/mete…

java上传类

publicString doFormFile(FormFile file, String dir) { try { File f new File(dir); if (!f.exists()) { f.mkdir();//如果路径不存在&#xff0c;创建 } InputStream in file.getInputStream(); …