很多新手不太清楚如何为提供程序连接池。NET框架SQL Server数据。为了帮助大家解决这个问题,下面小编就为大家详细讲解一下。需要的人可以从中学习,希望你能有所收获。
00-1010当连接打开时,将根据精确的匹配算法创建连接池,该算法将连接池与连接中的字符串相关联。每个连接池都与不同的连接字符串相关联。打开新连接时,如果连接字符串与现有池不完全匹配,将创建一个新池。
在下面的示例中,将创建三个新的SqlConnection对象,但是只需要两个连接池来管理这些对象。请注意,第一个和第二个连接字符串之间的差异是分配给初始目录的值。
SqlConnectionconn=newsql connection();conn . ConnectionString=' integrated security=SSPI;initial Talog=north wind ';conn . Open();//PoolAiscreated。SqlConnectionconn=newsql connection();conn . ConnectionString=' integrated security=SSPI;initial Talog=pubs ';conn . Open();//poolbiscreatedbecauseconnectionstringsdiffer。SqlConnectionconn=newsql connection();conn . ConnectionString=' integrated security=SSPI;initial Talog=north wind ';conn . Open();theconnectionstringmatchepoola。一旦连接池被创建,它将不会被销毁,直到活动进程终止。非活动或空池的维护需要最小的系统开销。
00-1010连接池是为每个唯一的连接字符串创建的。创建池时,将创建几个连接对象并将其添加到池中,以满足最小池大小要求。连接将根据需要添加到池中,直到达到最大池大小。
当请求SqlConnection对象时,如果有可用的连接,将从池中获取该对象。要成为可用的连接,该连接必须当前未使用,具有匹配的事务上下文或不与任何事务上下文相关联,并且具有到服务器的有效链接。
如果已达到最大池大小,并且没有可用的连接,则请求将排队。当连接释放回池中时,连接池管理器通过重新分配连接来满足这些请求。当在连接上调用关闭或释放时,连接被释放回池中。
警告建议在使用后始终关闭连接,以便连接可以返回到池中。这可以通过使用Connection对象的Close或Dispose方法来实现。未显式关闭的连接可能不会添加或返回到池中。例如,如果连接超出范围但未显式关闭,则只有在达到最大池大小时连接才会返回连接池,并且连接仍然有效。注意不要在类的Finalize方法中调用Close或Dispose on Connection、DataReader或任何其他托管对象。在终结器中,只释放类直接拥有的非托管资源。如果类不拥有任何非托管资源,请不要在类定义中包含Finalize方法。有关更多信息,请参见垃圾收集编程。00-1010如果连接生存期已过,或者连接池管理器检测到与服务器的连接已断开,连接池管理器将从池中删除该连接。请注意,只有在尝试与服务器通信后,才能检测到这种情况。如果发现连接不再连接到服务器,它将被标记为无效。连接池管理器定期扫描连接池,以查找已释放到池中并标记为无效的对象。一旦找到,这些连接将被永久删除。
如果与服务器的连接已经消失,即使连接池管理器没有检测到断开的连接并将其标记为无效,仍然可以将其从池中取出。当.的时候
发生这种情况时,将生成异常。但是,为了将该连接释放回池中,仍必须将其关闭。
事务支持
连接是根据事务上下文来从池中取出并进行分配的。请求线程和所分配的连接的上下文必须匹配。因此,每个连接池实际上又分为不具有关联事务上下文的连接以及 N 个各自包含与一个特定事务上下文的连接的子部分。
当连接关闭时,它将被释放回池中,并根据其事务上下文放入相应的子部分。因此,即使分布式事务仍然挂起,仍可以关闭该连接而不会生成错误。这样,您就可以在随后提交或中止分布式事务。
使用连接字符串关键字控制连接池
SqlConnection 对象的 ConnectionString 属性支持连接字符串键/值对,这些键/值对可用于调整连接池逻辑的行为。
下表描述了可用于调整连接池行为的 ConnectionString 值。
Connection Lifetime0当连接返回到池中时,将对它的创建时间和当前时间进行比较,如果时间间隔超过由 Connection Lifetime 指定的值(以秒为单位),则会毁坏该连接。在聚集配置中可以使用它来强制在运行服务器和刚联机的服务器之间达到负载平衡。
如果值为零 (0),则将使池连接具有最大的超时期限。
Connection Reset'true'确定在从池中移除数据库连接时是否将其重置。对于 Microsoft SQL Server 版本 7.0,如果设置为 false,将避免在获取连接时经历一个额外的往返过程,但必须注意的是连接状态(如数据库上下文)不会被重置。Enlist'true'当为 true 时,如果存在事务上下文,池管理程序将自动在创建线程的当前事务上下文中登记连接。Max Pool Size100池中允许的最大连接数。Min Pool Size0池中维护的最小连接数。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 应用程序的计数器值的总和。
名称 | 默认值 | 说明 | 计数器 | 说明 |
---|
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/123898.html