浅谈如何更好的打开和关闭ADO.NET连接池

简介:

MS提倡我们尽可能每次的在连接使用完成后就关闭;这样导致每次都要进行打开和关闭操作或用using(){…}写起代码比较麻烦,还有经常对池的操作似乎也带来一些性能上的问题;在Asp.net里一个WebForm经常涉及有N个数据库操作,为了方便直接在init里打开一个连接,然后在Dispose里关闭即省事又能减少对池的操作提高性能;那到底这样做能不能提高性能呢?答案是能,但有些情况估计会很让你感觉到失望…。当池的连接数能应付用户请求的时候,的确是可以减少池的操作带来性能的提升;反之就不一样了用户必须等待到获取连接后才能进行其他操作,当有更多用户在等待获取连接的时候只能让线程处于更长等待时间导致服务总体处理能力下降。

以下做一次简单的测试:

测试方式是使用VS2008自带的负载测试,测试用户数是200,数据库连接池数设置20,测度时长10分钟。

关闭ADO.NET连接池测试代码1:

protected void Page_Load(object sender, EventArgs e)

{

            using (System.Data.SqlClient.SqlConnection sqlconn= new  System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))

            {

                sqlconn.Open();

                System.Threading.Thread.Sleep(300);

            }

           

}

关闭ADO.NET连接池测试代码2

protected void Page_Load(object sender, EventArgs e)

        {

            using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))

            {

                sqlconn.Open();

            }

            System.Threading.Thread.Sleep(50);

            using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))

            {

                sqlconn.Open();

            }

            System.Threading.Thread.Sleep(50);

            using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))

            {

                sqlconn.Open();

            }

            System.Threading.Thread.Sleep(50);

            using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))

            {

                sqlconn.Open();

            }

            System.Threading.Thread.Sleep(50);

            using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection("data source=.;initial catalog=northwind;user id=sa;pwd=;Max Pool Size=20"))

            {

                sqlconn.Open();

            }

            System.Threading.Thread.Sleep(100);

        }

关闭ADO.NET连接池测试结果1

 

 

<!--[if !vml]-->

498)this.style.width=498;" height=582>


<!--[endif]-->

关闭ADO.NET连接池测试结果2

 

 

<!--[if !vml]-->

498)this.style.width=498;" height=584>


<!--[endif]-->

从以上测试结果来看显然是MS所提倡的方式在某些情况是更好的,因为随着并发用户的提高,即用即断的方式总体上表现效果更佳。还有一点非常重要就是第一种代码方式会启用了池的最大数据库连接数,而第二种代码方式只使用了6个数据库连接;这一点进一步说明了,即用即断在某种情况下更节省数据库连接资源。

虽然结果这样但不代表是什么情况都使用即用即断好,当池不会让用户在门外等的情况是不需要用的,当N个数据库操作间没其他特别耗时的运算最好就用一个连接(对于这个耗时多长就根据你实际情况作出权衡了),对于什么情况应该怎样做其实通过测试就能找到答案。不过我个人推荐还是用MS提倡的:),本人一向都是采用这种方式。  



本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2010/12/29/1921242.html,如需转载请自行联系原作者

目录
相关文章
|
10月前
|
SQL 数据库连接 数据库
在VS2013平台下,用VB.net 连接Access数据库
从开始学习计算机,我们使用的一直是SQL数据库。这次接触了Access数据库,我将从Access创建到连接向大家分享一下我在Access数据库中的收获。
203 0
|
SQL 数据库 数据安全/隐私保护
ADO.NET 连接数据库方式
使用Command和DataReader对象:
55 0
|
关系型数据库 MySQL 数据库连接
如何主动清空.NET数据库连接池?
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一维护,业务方通过某个配置字符串拿到的是开箱即用的Connection对象。
如何主动清空.NET数据库连接池?
|
关系型数据库 MySQL 数据库连接
怎么清空.NET数据库连接池
怎么清空.NET数据库连接池
155 0
|
SQL 数据库连接 数据库
一起谈.NET技术,详细述说ADO超时相关问题介绍
  在使用连接ADO超时。其混合了函数语言和物件导向程序编制语言,并且完美的适用于编程、算法、技术和探索性开发,因此可以在使用的过程当中感受到趣味性和吸引力。   使连接ADO超时     活动的突然增长可能使数据库服务器变得十分笨拙,大量增加建立数据库连接的时间。
805 0
|
存储 数据库连接 数据库
一起谈.NET技术,概括ADO.NET数据库连接的所有形式(基础)
  你可能熟悉其中部分数据库读取的形式,但是熟悉全部的估计很少,或者你完全忘记了,因为这些形式被封装到你自己框架的底层,自己搞过一两次就在也没有动手写过了。但是笔者觉得这部分知识是应该牢固掌握的,这个是基础。
841 0
|
Web App开发 数据库连接 数据库