理解.NET中的数据库连接池

转载 2007年09月18日 12:20:00
理解.NET中的数据库连接池
作者 Joydip Kanjilal

摘要:

       连接池能在程度上提高数据库访问性能。本文讨论到底何为连接池,它如何提高数据库访问性能,以及如何在.NET中创建连接池并增加或移除连接。

 

导言

       连接数据库是应用程序中耗费大量资源且相对较慢的操作,但它们又是至关紧要的。连接池是已打开的及可重用的数据库连接的一个容器。连接池在所有的数据库连接都关闭时才从内存中释放。使用连接池最基本的好处是提高应用程序的性能及可伸缩性,而其主要缺点是会有一个或多个数据库连接将一直保持打开状态,即使当前不在使用。ADO.NET的Data Providers将默认情况下将使用连接池,如果你不想使用连接池,必须在连接字符串中指定”Polling=false”。连接池中为你提供了空闲的打开的可重用的数据库连接,而不再需要每次在请求数据库数据时新打开一个数据库连接。当数据库连接关闭或释放时,将返回到连接池中保持空闲状态直到新的连接请求到来。如果我们有效地使用连接池,打开和关闭数据库将不再很耗费资源。本文讨论连接池的相关内容以及如何有效的使用连接池来提高应用程序的效率及可伸缩性。

 

连接池如何工作

       连接池中包含打开的可重用的数据库连接。在同一时刻同一应用程序域中可以有多个连接池,但连接池不可以跨应用程序域共享。注意:一个连接池是通过一个唯一的连接字符串来创建。连接池是根据第一次请求数据库连接的连接字符串来创建的,当另外一个不同的连接字符串请求数据库连接时,将创建另一个连接池。因此一个连接字符中对应一个连接池而不是一个数据库对应一个连接池。如以下代码所示

代码1

// 新建一个连接池

SqlConnection sqlConnection = new SqlConnection();

sqlConnection.ConnectionString = 

"Server=localhost;Database=test;User ID=joydip;Password=joydip;Trusted_Connection=False";

sqlConnection.Open();      

代码2

// 因为连接字符串不同,新建另一个连接池

SqlConnection conn = new SqlConnection();

sqlConnection.ConnectionString = 

"Server=localhost;Database=test;User ID=test;Password=test;Trusted_Connection=False";

sqlConnection.Open();   

代码3

// 因为连接字符串与代码1相同,不再创建连接池.

SqlConnection conn = new SqlConnection();

sqlConnection.ConnectionString = 

"Server=localhost;Database=test;User ID=joydip;Password=joydip;Trusted_Connection=False";

sqlConnection.Open();      

 

当有新的数据库连接请求到来时,连接池中连接进行了响应而不用创建一个新的数据库连接,也就是说数据库连接可以被重用,而不需要重新新建连接。因此这提高了应用程序的效率和可伸缩性。当你在应用程序中关闭一个打开的数据库连接时,该连接返回到连接池中等待重新连接直到等待超时。在这个时间内等待同一数据库相同连接信息的连接请求。如果这个时间内没有连接请求,这个数据库连接将被关闭,并从连接池中移除这个连接实例。

 

       当一个新的连接池创建后,数据库连接被添加到池中,连接池和池中的连接立即可被使用。连接池中将填满连接字个串中指定的最小连接数量的连接。连接池中连接在长时间不活动或超出指定的生存期时将被移除。

 

       连接池由连接池管理器维护。当后续的连接请求到来,连接池管理器在连接池中寻找可用的空闲的连接,如果存在就交给应用程序使用。以下描述了当一个新的连接请求到来时连接管理器如何工作

 

·         如果有未用连接可用,返回该连接

·         如果池中连接都已用完,创建一个新连接添加到池中

·        如果池中连接已达到最大连接数,请求进入等待队列直到有空闲连接可用

 

通过连接字符串中传递的参数可以控制连接池。基本的参数包括:

·         Connect Timeout

·         Min Pool Size

·        Max Pool Siz

·        Pooling

 

为了有效的使用连接池,记住数据库操作完成后马上关闭连接,这样连接才能返回连接池中。

 

提高连接池性能

       我们应该在最晚时刻打开连接并在最早时刻释放连接,即在使用完成后立即释放。数据库连接应该在真正请求数据时才打开,而不应在使用之前就请求连接,这会减少池中可用连接的数量,因此有害于连接池的操作及应用程序性能。数据库连接应使用完成后立即释放,这能促进连接池更好的使用,因为连接可以返回池中被重新使用。以下代码展示如何在应用程序中有效地打开和关闭连接

 

代码4

SqlConnection sqlConnection = new SqlConnection(connectionString);

try

{

  sqlConnection.Open();

  //Some Code

}

 

finally

{

  sqlConnection.Close();

}

代码4可以使用”using”关键字进一步简化如以下代码所示

代码5

using(SqlConnection sqlConnection = new SqlConnection(connectionString))

{

  sqlConnection.Open();

  //Some Code

}

 

注:以上代码5中的”using”关键字将隐含地生成try-finally块

 

 

 

以下列举了更好地使用连接池的几个可参考要点

·         在需要使用时才打开连接,并在完成操作后马上关闭

·         在关闭连接时先关闭相关用户定义的事务

·        确保维持连接池中至少有一个打开的连接

·         在使用集成身份验证的情况下避免使用连接池

 

连接池可以通过以下途径进行监控

·         使用sp_who或sp_who2存储过程

·        使用SQL Server的Profiler

·        使用性能监视器的性能计数器

 

参考文献

Tuning Up ADO.NET Connection Pooling in ASP.NET Applications

Connection Pooling for the .NET Framework Data Provider for SQL Server

The .NET Connection Pool Lifeguard

ADO.NET Connection Pooling Explained

 

结语

       连接池是数据库连接对象的容器,只要其中存在活动的或打开的连接它维持活动状态。当使用一个连接字符串来请求数据库连接时,将分配一个新的连接池。通过在应用程序中使用相同的连接字符串我们可以提高应用程序的性能和可伸缩性。然而如果我们不正确地使用连接池可能给我们的应用程序带来负效果。MSDN中说“连接是提高应用程序性能的有力工具,但如果使用不当连接池非但不是有益的而且是害的”。本文讨论了连接池的相关内容以及如何有效的使用连接池来提高应用程序的效率及可伸缩性。
 

理解.NET中的数据库连接池

摘要: 连接池能在程度上提高数据库访问性能。本文讨论到底何为连接池,它如何提高数据库访问性能,以及如何在.NET中创建连接池并增加或移除连接。导言 连接数据库是应用程序中耗费大量资源且相对较慢的操作,...
  • aptentity
  • aptentity
  • 2010年06月06日 23:41
  • 213

数据库连接池理解

1 数据库连接池中的连接,本质是一种对象,创建连接池,可以减少对象初始化、创建的时间,这个和线程池有点类似。都是为了节省创建时间,资源复用。 2 和连接池一样,数据库连接池创建的一般也有最大,最小值...
  • a314773862
  • a314773862
  • 2016年12月25日 13:16
  • 453

asp.net如何设置数据库连接池的数量

可以使用一组名称-值对以链接字符串的形式配置链接池。例如,可以配置池是否有效(默认是有效的),池的最大、最小容量,用于打开链接的排队请求被阻断的时间。下面的示例字符串配置了池的最大和最小容量。 "Se...
  • networdboy
  • networdboy
  • 2007年12月05日 23:04
  • 1318

ADO.NET 细说数据库连接池

ADO.NET 细说数据库连接池 题外话 通过前几章的学习,不知道大家对ADO.NET有一定的了解了没有。撇开文章质量不讲,必须肯定的是,我是用心去写每一篇文章的。无论是是在排版上,还...
  • moshansk
  • moshansk
  • 2014年08月06日 09:58
  • 1282

ADO.NET数据库连接池研究(一) -查看连接池数

用sp_who查看数据库连接数 大家都知道ADO.NET自带链接池,而且在默认状态下是开启的,如果不设置的话,最大允许的链接个数为100个。       那么怎么样能够看到连接池里现在活动的链接是...
  • envenler
  • envenler
  • 2011年04月22日 20:18
  • 2842

数据库 连接池的深入理解

一、应用程序直接获取数据库连接的缺点   用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次...
  • yanlove_jing
  • yanlove_jing
  • 2016年05月23日 16:42
  • 3624

理解.NET中的数据库连接池[摘]

摘要:  连接池能在程度上提高数据库访问性能。本文讨论到底何为连接池,它如何提高数据库访问性能,以及如何在.NET中创建连接池并增加或移除连接。导言  连接数据库是应用程序中耗费大量资源且相对较慢的操...
  • qzq14
  • qzq14
  • 2010年05月04日 15:36
  • 145

.Net与Oracle的数据库连接池(ConnectionPool)

数据库连接池允许应用程序重用已存在于池中的数据库连接,以避免反复的建立新的数据库连接。这种技术能有效提高应用程序的伸缩性,因为有限的数据库连接能够给大量的客户提供服务。这种技术同时也提高的系统性能,避...
  • xwnxwn
  • xwnxwn
  • 2017年04月18日 10:40
  • 1107

理解.NET中的数据库连接池(转)

http://blog.sina.com.cn/s/blog_701069240100qzzd.html 摘要:   连接池能在程度上提高数据库访问性能。本文讨论到底何为连接...
  • zunguitiancheng
  • zunguitiancheng
  • 2014年05月21日 01:08
  • 288

对.net framework的理解

.net framework主要包含一个庞大的代码库,在VS中所有的自己写的代码都直接或者间接的使用.net framework,那么这些代码是怎么运行的呢,首先,在VS环境下,首先把使用.net f...
  • houwc
  • houwc
  • 2015年07月06日 20:58
  • 703
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解.NET中的数据库连接池
举报原因:
原因补充:

(最多只允许输入30个字)