当前位置:  数据库>sqlserver

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

    来源: 互联网  发布时间:2014-09-05

    本文导语:  您也可以提供几个连接字符串修饰符来控制连接池行为,请参见本主题内下文中“使用连接字符串关键字控制连接池”这一节。 池的创建和分配 当连接打开时,将根据一种精确的匹配算法来创建连接池,该算法会使连接池与...

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

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

在以下示例中,将创建三个新的 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 应用程序的计数器值的总和。

    
 
 

您可能感兴趣的文章:

  • 在Linux下可以装.NET Framework吗?
  • aspnet_regiis.exe 重新注册 .NET Framework
  • .NET Framework 4.0 初始化错误的解决方法
  • IIS7使用.NET Framework v4.0运行库报500错误的解决办法
  • C#难点逐个击破(6):C#数据类型与.net framework数据类型
  • Win2008 R2安装.NET Framework 4的windows6.1-KB958488-V6001-x64出现灾难性故障解决方法
  • 在IIS上重新注册.NET Framework 2.0的命令和参数详解
  • Enterprise Library for .NET Framework 2.0缓存使用实例
  • net-snmp如何去连接外部的库
  • 运行lumaqq时,出现了一个“连接错误”,说“edu.tsinghua.lumaqq.net.porter",是怎么加事啊?
  • asp.net 在webcofig中连接数据库二种方式
  • 基于.net中突破每客户端两个http连接限制的详细介绍
  • asp.net怎么连接access数据库
  • c#(asp.net)连接excel的实例代码
  • asp.net使用ODP即oracle连接方式的的防注入登录验证程序
  • vb.net实例代码 连接访问数据库文件(mdb)
  • asp.net 3.5中在web.config文件创建ACCESS连接字符串的方法
  • asp.net连接数据库超时的解决办法
  • ASP.NET连接MySql数据库的2个方法及示例
  • c#数据绑定之向查询中添加参数(.Net连接外部数据库)
  • CVS无法连接sourceForge.net
  • C#利用ODP.net连接Oracle数据库的操作方法
  • 在64位机器上使用plSQL连接Oracle的问题(SQL*Net not properly installed)
  • asp.net连接数据库读取数据示例分享
  • ADO.NET数据连接池剖析
  • asp.net连接查询SQL数据库并把结果显示在网页上(2种方法)
  • asp.net web.config配置连接字符串的方法
  • 如何用COM.ibm.db2.jdbc.net.DB2Driver连接DB2数据库
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 【人才】有没有人会用VC6.0/VS2003.NET/VS2005.NET写WINDOWS下的驱动程序呀。
  • UNIX下 wc,grep,和修改文本文件的c程序的源程序那位高人能否提供一份? zero_baby@163.net
  • asp.net应用程序的生命周期和iis应用程序池
  • 谁有UNIX下编写菜单程序的源码,E一份给我!(Daiver@163.net)
  • 谁有UNIX下编写菜单程序的源码,E一份给我!(horby@263.net)救火!
  • 运行asp.net程序 报错:磁盘空间不足
  • 微软.NET被《Waters》评为最佳程序开发平台
  • 请问能不能把asp.net程序部署在linux服务器上????? 谢谢!!!
  • 我现在编的asp.net程序能不能不做大的修改跑在linux上?
  • C#.NET程序添加到右键菜单的实现代码
  • 哪位有JAVA程序员认证考试的中英文教材啊?有的话请发往 ALAN_Z99@263.NET 太感谢了!
  • .NET中获取程序根目录的常用方法介绍
  • ASP.NET 程序中删除文件夹导致session失效问题的解决办法分享
  • PowerShell 定时执行.Net(C#)程序的方法
  • .Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用
  • 关于C#.net winform程序验证moss的集成身份认证实例
  • asp.net 由于无法创建应用程序域,因此未能执行请求错误的解决方法
  • .NET程序页面中,操作并输入cmd命令的小例子
  • asp.net 服务器应用程序不可用的解决办法
  • C#实现只运行单个实例应用程序的方法(使用VB.Net的IsSingleInstance)
  • java命名空间javax.net类socketfactory的类成员方法: createsocket定义及介绍
  • .NET版的ExtJS库 Ext.Net
  • java命名空间java.net类datagramsocket的类成员方法: disconnect定义及介绍
  • node.js的.net扩展 node.net
  • java命名空间java.net类datagramsocket的类成员方法: close定义及介绍
  • 为什么输http://www.china-java.net,会自动改为http://www.china-java.net:8081?
  • java命名空间java.net接口cookiestore的类成员方法: get定义及介绍
  • 各位之不知道net-snmp是否收费?我的产品中用到了net-snmp lib是否需要向什么单位或者组织付费?
  • java命名空间java.net类socket的类成员方法: isbound定义及介绍
  • Java.NET or J#.NET is coming!
  • java命名空间java.net类datagrampacket的类成员方法: getsocketaddress定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3