`

ADO.NET数据库连接池的介绍

 
阅读更多

摘录自MSDN:

建立池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET Framework 数据提供程序自动为 ADO.NET 客户端应用程序提供连接池。您也可以提供几个连接字符串修饰符来控制连接池行为,请参见本主题内下文中“使用连接字符串关键字控制连接池”这一节。

池的创建和分配

当连接打开时,将根据一种精确的匹配算法来创建连接池,该算法会使连接池与连接中的字符串相关联。每个连接池都与一个不同的连接字符串相关联。当新连接打开时,如果连接字符串不精确匹配现有池,则将创建一个新池。

在以下示例中,将创建三个新的 SqlConnection 对象,但只需要使用两个连接池来管理这些对象。请注意,第一个和第二个连接字符串的差异在于为 Initial Catalog 分配的值。

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();      
// Pool A is created.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";
conn.Open();      
// Pool B is created because the connection strings differ.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();      
// The connection string matches pool A.

连接池一旦创建,直到活动进程终止时才会被毁坏。非活动或空池的维护只需要最少的系统开销。

连接的添加

连接池是为每个唯一的连接字符串创建的。当创建一个池后,将创建多个连接对象并将其添加到该池中,以满足最小池大小的要求。连接将根据需要添加到池中,直至达到最大池大小。

当请求 SqlConnection 对象时,如果存在可用的连接,则将从池中获取该对象。若要成为可用连接,该连接当前必须未被使用,具有匹配的事务上下文或者不与任何事务上下文相关联,并且具有与服务器的有效链接。

如果已达到最大池大小且不存在可用的连接,则该请求将会排队。当连接被释放回池中时,连接池管理程序通过重新分配连接来满足这些请求。对 Connection 调用 CloseDispose 时,连接被释放回池中。

警告 建议使用完 Connection 后始终将其关闭,以便连接可以返回到池中。这可以使用 Connection 对象的 CloseDispose 方法来实现。不是显式关闭的连接可能不会添加或返回到池中。例如,如果连接已超出范围但没有显式关闭,则仅当达到最大池大小而该连接仍然有效时,该连接才会返回到连接池中。
注意 不要在类的 Finalize 方法中对 ConnectionDataReader 或任何其他托管对象调用 CloseDispose。在终结器中,仅释放类直接拥有的非托管资源。如果类不拥有任何非托管资源,则不要在类定义中包含 Finalize 方法。有关更多信息,请参见垃圾回收编程

连接的移除

如果连接生存期已过期,或者连接池管理程序检测到与服务器的连接已断开,连接池管理程序将从池中移除该连接。请注意,只有在尝试与服务器进行通信后,才可以检测到这种情况。如果发现某连接不再连接到服务器,则会将其标记为无效。连接池管理程序会定期扫描连接池,查找已释放到池中并标记为无效的对象。找到后,这些连接将被永久移除。

如果存在与已消失的服务器的连接,那么即使连接池管理程序未检测到已断开的连接并将其标记为无效,仍有可能将此连接从池中取出。当发生这种情况时,将生成异常。但是,为了将该连接释放回池中,仍必须将其关闭。

事务支持

连接是根据事务上下文来从池中取出并进行分配的。请求线程和所分配的连接的上下文必须匹配。因此,每个连接池实际上又分为不具有关联事务上下文的连接以及 N 个各自包含与一个特定事务上下文的连接的子部分。

当连接关闭时,它将被释放回池中,并根据其事务上下文放入相应的子部分。因此,即使分布式事务仍然挂起,仍可以关闭该连接而不会生成错误。这样,您就可以在随后提交或中止分布式事务。

使用连接字符串关键字控制连接池

SqlConnection 对象的 ConnectionString 属性支持连接字符串键/值对,这些键/值对可用于调整连接池逻辑的行为。

下表描述了可用于调整连接池行为的 ConnectionString 值。

名称默认值说明
Connection Lifetime 0 当连接返回到池中时,将对它的创建时间和当前时间进行比较,如果时间间隔超过由 Connection Lifetime 指定的值(以秒为单位),则会毁坏该连接。在聚集配置中可以使用它来强制在运行服务器和刚联机的服务器之间达到负载平衡。

如果值为零 (0),则将使池连接具有最大的超时期限。

Connection Reset 'true' 确定在从池中移除数据库连接时是否将其重置。对于 Microsoft SQL Server 版本 7.0,如果设置为 false,将避免在获取连接时经历一个额外的往返过程,但必须注意的是连接状态(如数据库上下文)不会被重置。
Enlist 'true' 当为 true 时,如果存在事务上下文,池管理程序将自动在创建线程的当前事务上下文中登记连接。
Max Pool Size 100 池中允许的最大连接数。
Min Pool Size 0 池中维护的最小连接数。
Pooling 'true' 当为 true 时,将从相应的池中取出连接,或者在必要时创建连接并将其添加到相应的池中。

连接池的性能计数器

SQL Server .NET Framework 数据提供程序添加了几个性能计数器,它们将使您能够微调连接池特性,检测与失败的连接尝试相关的间歇性问题,并检测与对 SQL Server 的超时请求相关的问题。

下表列出了可以在“.NET CLR 数据”性能对象下的“性能监视器”中访问的连接池计数器。

计数器 说明
SqlClient: Current # pooled and non pooled connections 当前池连接或非池连接的数目。
SqlClient: Current # pooled connections 当前所有池中与特定进程关联的连接的数目。
SqlClient: Current # connection pools 当前与特定进程关联的池的数目。
SqlClient: Peak # pooled connections 自特定进程开始以来所有池中的连接数峰值。请注意:此计数器只有在与特定进程实例关联时才可用。_Global 实例始终返回 0。
SqlClient: Total # failed connects 打开连接的尝试因任何原因而失败的总次数。
注意 将 SQL Server .NET Framework 数据提供程序性能计数器与 ASP.NET 应用程序一起使用时,只有 _Global 实例是可用的。因此,性能计数器返回的值是所有 ASP.NET 应用程序的计数器值的总和。
分享到:
评论

相关推荐

    Ado.Net数据库连接字符串大全

    本篇文章将深入探讨Ado.Net数据库连接字符串的使用,以及如何通过OLEDB和ODBC连接到不同的数据库。 首先,连接字符串是Ado.Net与数据库建立连接的关键,它包含了数据库服务器的地址、数据库名、用户名、密码等信息...

    ADO.NET数据库访问技术案例教程

    在本"ADO.NET数据库访问技术案例教程"中,我们将深入探讨ADO.NET的核心概念、主要组件以及如何在实际项目中应用这些技术。 首先,ADO.NET的基础是连接(Connection)、命令(Command)、数据适配器(DataAdapter)...

    ADO.net数据库连接示例程序

    以上是ADO.NET数据库连接的基本概念和使用方式,实际应用中还可能涉及更多复杂场景,如分页查询、批量插入、异步操作等。这个示例程序应该会涵盖这些基本操作,帮助开发者了解如何在.NET环境中与数据库进行交互。

    ADO.Net数据库访问(代码示例)

    这个标题"ADO.Net数据库访问(代码示例)"暗示我们将深入探讨如何使用ADO.NET进行数据库的读取、写入和其他相关操作,并通过具体的代码示例来解释这些概念。 首先,ADO.NET的核心组件包括: 1. **DataSet**: 这是一...

    ADO.NET数据库实例

    这个实例着重展示了如何利用ADO.NET进行数据库的基本操作,如连接数据库、执行SQL语句、处理结果集等。下面将详细阐述ADO.NET的主要组件及其在SQL Server中的应用。 1. **Connection对象**:这是与数据库建立连接的...

    ADO.NET数据库操作

    8. **错误处理和连接池(Error Handling and Connection Pooling)**:ADO.NET提供了异常处理机制来捕获和处理数据库操作中的错误。此外,连接池机制提高了性能,通过重用已打开的连接而不是频繁地打开和关闭新的...

    ADO.NET连接池示例

    ADO.NET链接对象(SqlConnection或者OracleConnection)默认情况都开启连接池(平时编程时可能会忽略)。当我们调用Close或者Dispose方法时,实际并不断开连接,而是把连接放回连接池,再次使用时候重连接池中取得...

    ADO.NET数据库访问技术试题

    总结来说,ADO.NET提供了连接数据库、查询数据、更新数据以及与XML集成的能力,通过不同的数据提供程序适应多种数据库环境,而连接池、Command对象等机制则优化了性能和资源管理。了解和熟练掌握这些知识点对于开发...

    ADO.NET数据库访问

    10. 使用连接池(Connection Pooling):ADO.NET自动实现了连接池,提高了性能,因为频繁打开和关闭数据库连接会消耗大量资源。连接池管理着数据库连接的生命周期,复用已关闭但尚未实际释放的连接。 通过学习以上...

    ADO.NET数据库访问技术案例式教程课件

    这个“ADO.NET数据库访问技术案例式教程课件”很可能是为了教授如何利用ADO.NET进行数据库操作,包括连接数据库、执行SQL语句、处理结果集以及事务管理等核心概念。 首先,ADO.NET的核心组件主要包括: 1. **...

    ADO.NET数据库编程

    总之,ADO.NET数据库编程实验不仅教会我们如何利用数据窗体向导快速构建用户界面,还涵盖了数据库连接、数据集操作、异常处理和连接池管理等关键知识点,这对于理解和掌握.NET框架下的数据库应用程序开发至关重要。...

    vb.net数据库连接实例

    在VB.NET中,数据库连接是...通过以上步骤,你可以创建一个简单的VB.NET数据库连接实例。在实际应用中,还可以使用ORM(对象关系映射)框架,如Entity Framework,来简化数据访问层的开发,使代码更加简洁和易于维护。

    ADO.NET操作数据库

    在ADO.NET中,正确地管理和使用数据库连接至关重要,这直接影响到应用程序的性能和稳定性。以下是关于数据库连接管理的关键点: ##### 2.1 数据库连接字符串 连接字符串是连接到数据库的关键信息,通常包含服务器...

    ADO.NET数据库实例教程

    通过这个ADO.NET数据库实例教程,你可以逐步学习如何使用这些组件来构建数据库应用程序,无论是简单的CRUD操作还是复杂的业务逻辑处理。通过实际操作,加深对ADO.NET的理解,提升数据库开发技能。

    数据结构ADO.net访问数据库

    数据结构ADO.net访问数据库内涵详细信息

    ado.net 连接数据库封装

    本篇文章将基于给定的部分内容,详细介绍如何在ADO.NET中实现数据库连接的封装。 #### 二、知识点详解 ##### 2.1 使用命名空间 在给定的代码片段中,可以看到多个`using`语句,这些语句引入了ADO.NET相关的命名...

    ADO.NET之连接池技术的使用详解

    ADO.NET具有连接池的特性,连接池的功能是保留一定数量的连接,当用户使用相同的连接字符串再次连接服务器时,ASO.NET将使用连接池中的连接而不用重新发起一次连接过程。当调用Close方法关闭连接时,ADO.NET将使用...

    学习ADO.NET的数据库连接

    此外,了解并掌握ADO.NET的连接池机制也很重要,它能显著提高应用程序的性能。 总结来说,学习ADO.NET的数据库连接,你需要掌握SqlConnection、SqlCommand、SqlDataAdapter等核心组件的用法,理解非连接式数据操作...

    C#高效数据库连接池源码

    数据库连接池是数据库管理中的重要概念,特别是在高并发和大数据量的应用场景下,它能显著提升性能并降低系统资源消耗。在C#编程环境中,我们可以使用自定义的数据库连接池来实现这一功能。本篇文章将深入探讨“C#...

Global site tag (gtag.js) - Google Analytics