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

分类:编程技术 时间:2024-02-20 16:06 浏览:0 评论:0
0
.NET Framework SQL Server数据如何提供程序连接池?很多新手对此并不是很清楚。为了帮助大家解决这个问题,下面小编就为大家详细讲解一下。有这方面需求的人可以过来学习。希望你能有所收获。

池创建和分配

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

在下面的示例中,创建了三个新的SqlConnection对象,但仅使用两个连接池来管理它们。请注意,第一个和第二个连接字符串之间的差异是以下值:签署到初始目录

SqlConnection conn = new SqlConnection();conn.ConnectionString = "集成安全性=SSPI;初始目录=northwind";conn.Open(); // 创建池 A。SqlConnection conn = new SqlConnection();conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";conn.Open(); // 由于连接字符串不同而创建 B 池。SqlConnection conn =new SqlConnection();conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";conn.Open(); // 连接字符串与池A匹配。

连接池一旦创建,就不会处于活动状态,直到活动进程终止时才被销毁。维护不活动或空的池需要最小的系统开销。

添加连接

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

当请求SqlConnection对象时,如果连接可用,则从池中获取该对象。要成为可用的连接,该连接当前不得在使用中、具有匹配的事务上下文或与无事务上下文关联,并且具有到服务器的有效链接。

如果已达到最大池大小并且没有可用连接,则请求将排队。当连接被释放回池中时,连接池管理器通过重新分配连接来满足这些请求。当对连接调用 Close 或 Dispose 时,连接将被释放回池中。

警告建议在使用连接后始终将其关闭,以便连接可以返回到池中。这可以使用 Connection 对象的 Close 或 Dispose 方法来完成OD。未显式关闭的连接可能无法添加或返回到池中。例如,如果连接超出范围但未显式关闭,则只有在达到最大池大小并且连接仍然有效时,该连接才会返回到连接池。
请注意,不要在类的 Finalize 方法中对 Connection、DataReader 或任何其他托管对象调用 Close 或 Dispose。在终结器中,仅释放该类直接拥有的非托管资源。如果类不拥有任何非托管资源,则不要在类定义中包含 Finalize 方法。有关详细信息,请参阅垃圾收集编程

连接的移除

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

如果到服务器的连接消失了,即使连接池管理器没有检测到断开的连接并将其标记为无效,该连接也可能被从池中取出。发生这种情况时,会生成异常。但是,为了将连接释放回池中,仍然必须关闭它。

事务支持

连接从池中获取并根据事务上下文进行分配。请求线程的上下文和分配的连接必须匹配。因此,每个连接池实际上是划分的d 成没有关联事务上下文的连接和N 个子部分,每个子部分都包含到特定事务​​上下文的连接。

当连接关闭时,它会被释放回池中,并根据其事务上下文放入适当的分段中。因此,即使分布式事务仍处于待处理状态,仍然可以关闭连接而不会产生错误。这允许您随后提交或中止分布式事务。

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

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

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

Connection Lifetime0 当一个连接返回到池中时,会比较它的创建时间当前时间。如果时间间隔超过Connection Lifetime指定的值(以秒为单位),连接将被销毁。连接。这可以在集群配置中使用,以强制正在运行的服务器和刚刚上线的服务器之间进行负载平衡。

值为零 (0) 将导致池连接具有最大超时期限。

连接重置“true”确定数据库连接从池中删除时是否重置。对于 Microsoft SQL Server 7.0 版本,如果设置为 falsee,将避免在获取连接时经历额外的往返,但必须注意的是,连接状态(例如数据库上下文)不会被重置。 Enlist 'true' 当为 true 时,如果存在事务上下文,池管理器将自动在创建线程的当前事务上下文中注册连接。 Max Pool Size100 池中允许的最大连接数。 Min Pool Size0 最小数量 of 连接在池中维护。 Pooling 'true' 当为 true 时,将从相应的池中取出连接,或者,如果需要,将创建连接并将其添加到相应的池中。

连接池的性能计数器

SQL Server .NET Framework 数据提供程序添加了多个性能计数器,允许您微调连接池功能、检测间歇性与失败的连接尝试相关的问题并检测与 SQL Server 超时请求相关的问题。

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

SqlClient:当前池化和非池化连接数当前池化连接或非池化连接的数量。 SqlClient:当前池连接数所有当前池中与特定进程关联的连接数。 SqlClient: Current # 连接池 池数当前与特定进程相关联。 SqlClient: Peak # pooled Connections 自特定进程启动以来所有池中的连接峰值数。注意:此计数器仅在与特定流程实例关联时才可用。 _Global 实例始终返回 0。 SqlClient: Total # failedconnects 尝试打开因任何原因失败的连接的总次数。

注意将 SQL Server .NET Framework 数据提供程序性能计数器与 ASP.NET 应用程序一起使用时,只有 _Global 实例可用。因此,性能计数器返回的值是所有 ASP.NET 应用程序的计数器值的总和。
名称默认值描述计数器描述

阅读以上内容对您有帮助吗?如果你想想要了解更多相关知识或者阅读更多相关文章,请关注行业资讯频道。感谢您的支持。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > .NET Framework SQL Server数据如何提供程序连接池

用户评论