理解.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中说“连接是提高应用程序性能的有力工具,但如果使用不当连接池非但不是有益的而且是害的”。本文讨论了连接池的相关内容以及如何有效的使用连接池来提高应用程序的效率及可伸缩性。
 

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

摘要:.NET 数据库连接池能在很大程度上提高数据库访问性能。本文讨论到底何为连接池,它如何提高数据库访问性能,以及如何在.NET中创建连接池并增加或移除连接。 导言:     连接数据库是应用程...
  • wxzyq
  • wxzyq
  • 2011年08月21日 08:12
  • 1224

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

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

Ado.net中SQLServer数据库连接池

Ado.net中SQLServer数据库连接池 关于数据库连接池,MSDN有如下文字: 连接到数据库服务器通常由几个需要很长时间的步骤组成。 必须建立物理通道(例如套接...
  • Draling
  • Draling
  • 2013年05月08日 17:11
  • 1823

你必须知道的ADO.NET(五) 细说数据库连接池

题外话 通过前几章的学习,不知道大家对ADO.NET有一定的了解了没有。撇开文章质量不讲,必须肯定的是,我是用心去写每一篇文章的。无论是是在排版上,还是在内容选取上我都花了不少心思。我希望通过本系列...

ADO.NET入门教程(五) 细说数据库连接池

摘要 今天我要讲的是数据库连接池。说实话,我表示鸭梨很大。因为相比其他章节来说,连接池相对来说难理解一点。我要用最通俗的语句给大家讲明白,讲透彻却也不是一件很容易的事。但是,连接池又是非常重要的...
  • 3150379
  • 3150379
  • 2015年03月09日 20:04
  • 453

ADO.NET中SQL Server数据库连接池

实际上,大多数应用程序仅使用一个或几个不同的连接配置。 这意味着在执行应用程序期间,许多相同的连接将反复地打开和关闭。 为了使打开的连接成本最低,ADO.NET 使用称为连接池的优化方法。 连接池减...
  • unciel
  • unciel
  • 2011年08月12日 10:24
  • 374

Ado.net中SQLServer数据库连接池

关于数据库连接池,MSDN有如下文字: 连接到数据库服务器通常由几个需要很长时间的步骤组成。 必须建立物理通道(例如套接字或命名管道),必须与服务器进行初次握手,必须分析连接字符串信...
  • F7ANTY
  • F7ANTY
  • 2013年04月16日 14:59
  • 527

ADO.NET 细说数据库连接池

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

.NET 数据库连接池类

/// /// 数据库连接池 /// internal static class WAFConnectionPool { //list o...

细说ADO.NET数据库连接池

题外话 通过前几章的学习,不知道大家对ADO.NET有一定的了解了没有。撇开文章质量不讲,必须肯定的是,我是用心去写每一篇文章的。无论是是在排版上,还是在内容选取上我都花了不少心思。我希望通过本...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解.NET中的数据库连接池
举报原因:
原因补充:

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