.NET Framework SQL Server 数据提供程序连接池

您也可以提供几个连接字符串修饰符来控制连接池行为,请参见本主题内下文中“使用连接字符串关键字控制连接池”这一节。

池的创建和分配

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

在以下示例中,将创建三个新的 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 调用 Close 或 Dispose 时,连接被释放回池中。

警告   建议使用完 Connection 后始终将其关闭,以便连接可以返回到池中。这可以使用 Connection 对象的 Close 或 Dispose 方法来实现。不是显式关闭的连接可能不会添加或返回到池中。例如,如果连接已超出范围但没有显式关闭,则仅当达到最大池大小而该连接仍然有效时,该连接才会返回到连接池中。 注意   不要在类的 Finalize 方法中对 Connection、DataReader 或任何其他托管对象调用 Close 或 Dispose。在终结器中,仅释放类直接拥有的非托管资源。如果类不拥有任何非托管资源,则不要在类定义中包含 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 应用程序的计数器值的总和。

时间: 2024-09-01 07:19:31

.NET Framework SQL Server 数据提供程序连接池的相关文章

SQL Server .NET Framework 数据提供程序连接池

server|程序|数据 有朋友建议我控制连接池的连接,说是为了提高性能,但看了下面的这个文章,感觉连接池是由系统自身进行维护的,程序没有必要去进行控制的.大家有什么意见吗?在连接问题上,是否有提高性能的方法? SQL Server .NET Framework 数据提供程序连接池池连接可以显著提高应用程序的性能和可缩放性.SQL Server .NET Framework 数据提供程序自动为 ADO.NET 客户端应用程序提供连接池.您也可以提供几个连接字符串修饰符来控制连接池行为,请参见本主

SQL Server数据导入导出技术概述与比较

当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新建的数据库中时,尤其是在进行数据检验.净化和转换时,将会面临很大的挑战.幸好SQL Server为我们提供了强大.丰富的数据导入导出功能,并且在导入导出的同时可以对数据进行灵活的处理. 在SQL Server中主要有三种方式导入导出数据:使用Transact-SQL对数据进行处理:调用命令行工具bcp处理数据:使用数据转换服务(DTS)对数据进行处理.这三种方法各有其特点,下面就它们的主要特点进行比较. 一.使用方式的比

SQL Server on Linux BCP工具导出RDS SQL Server数据

摘要: SQL Server发布了Linux版本之后,客户增加了一些新需求,总结主要有以下两种: 1.是否支持在Linux操作系统保存,RDS SQL Server的CSV格式文件到文件系统 2.在一台Linux系统的主机同时管理RDS MySQL实例数据和RDS SQL Server数据 需求解读: SQL Server BCP工具可以满足以上需求,这个工具提供了导出CSV格式的文本,可以保存在Linux文件系统,同时也可以方便的讲这个CSV文件导入到RDS MySQL实例或其他支持标准CSV

ASP实现备份sql server数据

server|sql|备份|数据 建个bak文件夹啊,放数据! db.asp代码如下: <%dim conndim connstr'on error resume nextset conn=server.CreateObject("adodb.connection")connstr="Provider=SQLOLEDB;data source=192.168.2.1;UID=sa;Pwd=123;DataBase=test"conn.Open connstr

使用SQL Server数据服务开发功能强大且可扩展的应用程序

本文使用了以下技术: SQL Server 本文将介绍以下内容: SSDS 数据模型 管理实体.容器和颁发机构 创建示例 Web 应用程序 类序列化和反序列化 本专栏基于 SQL Server 数据服务的预发布版本撰写而成.文中包含的所有信息均有可能发生变更. 目录 SSDS 数据模型 构建分类广告系统 添加城市 添加类别 更新和删除实体 添加和删除列表架构 分类 Web 应用程序 类反序列化 使用自定义列表架构

sql server数据|sql server数据库入侵渗透~~求大神

问题描述 sql server数据|sql server数据库入侵渗透~~求大神 QQ200832005[招聘]渗透测试工程师(可兼职也可接私活) 技能要求 具有至少1年以上的职业黑客攻击经验,并实际操作过各类项目,拒绝理论派.熟悉渗透测试服务器提权方面. 1.掌握MySQL.MSSQL.Oracle.PostgreSQL等一种或多种主流数据库结构以及特殊性. 2.熟悉渗透测试的步骤.方法.流程.熟练掌握各种渗透测试工具. 3.有主机.网络或Web安全渗透测试相关项目实施经验&. 4.对网站/服

sqlserver-关于oracle向sql server数据迁移问题

问题描述 关于oracle向sql server数据迁移问题 请教各位大神怎么让这个接口程序出来呢 解决方案 在 SQL Server 服务器上要装 Oracle 的客户端,并且做好配置. 其实所有的数据库都需要有客户端才能访问,谁叫SQL Server是微软的呢,装系统的时候就偷偷地把客户端装上去了. 如果是一次性迁移,不如Oracle生成脚本,人工修改一下,到SQL Server中执行. 解决方案二: 可以参考一下这个链接 Microsoft OLE DB Provider for Orac

sql server- 求教一个SQL SERVER数据导入问题

问题描述 求教一个SQL SERVER数据导入问题 我有几个表的数据要导入,每个表大概50到500W数据,为了方便后面对表的数据处理,我会在表中创建组合非聚集索引,请问我在应该在导之前建还是导之后建?如果是导之后建,建起来也挺慢的,有什么方法快速创建吗 解决方案 导入之后建,建立索引需要遍历表,计算每个字段,添加到索引存储中,所以肯定耗时,不管先建还是后建.但是推荐后建. 解决方案二: 检查下并行度参数设置,或者修改sql代码如下 maxdop=8,online=on 解决方案三: 创建速度应该

将SQL Server数据迁移到MySQL的方法

一.SQL Server中常用数据类型与MySQL不同的地方     二.将SQL Server数据迁移到MySQL需要注意的一些问题     1.唯一索引的不同,sql server的唯一索引的字段只能允许存在一个null值,而mysql,一直oracle中唯一索引对应的字段都允许存在多个null值.   2.存储过程的语法存在很大的不同,存储过程的迁移是最麻烦的,需要仔细修改.   3.程序中部分写的SQL语句由于语法的不同也要相应的修改.   三.将SQL Server数据迁移到MySQL