.NET框架SQL Server数据提供程序的连接池

来源:互联网 发布:js如何实现文件上传 编辑:程序博客网 时间:2024/05/16 07:18
第一次翻译msdn文章,对原文中有疑惑处都在中文后面的括号中标明了原文。可能网上有人翻译过这篇文章了,我只是为了能加深自己印象,因为工作中需要了解相关的知识。
原文在这里:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.asp
 
池化的连接能够显著地提高您的应用程序的性能和可监视性能(scalability)。.NET框架的SQL Server数据提供程序自动为您的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对象上调用Close或者Dispose方法时,连接对象将被释放到连接池中。
警告:建议在使用完连接对象后总是关闭连接以便该连接对象能够返回到连接池中。这可以通过Connection对象的Close或者Dispose方法来实现。没有被显式关掉的连接可能不会被添加或者返回到连接池里面。例如,一个连接对象已经超出了范围但是没有被明确地关闭,那么只有当连接数目达到最大了并且该连接仍然有效的时候才会被返回到连接池中去。
注意:不要在您的类的Finalize方法里调用ConnectionDataReader,或者任何其它托管对象的CloseDispose方法在析构器里,只释放您的类直接所有的未托管资源。如果您的类没有包含任何未托管资源,不要在类的定义里面包含Finalize方法。更多详情,见Programming for Garbage Collection
移除连接
如果连接对象生存期已过,或者连接池监测到与服务器连接已被处置(servered),连接池将从池中移除一个连接。注意只有在尝试同服务器通讯之后才能被监测到。如果一个连接对象被发现与服务器断开连接了,将被标记为无效。连接池周期性地扫描以寻找已被释放到连接池的和被标记为无效的连接对象。这些连接对象将被永久性地删除。
如果和连接对象连接的服务器已经不存在了,该连接对象可能被从连接池中拖出(drawn),即使连接池没有监测到被处置(servered)的连接并且标记为无效。在这种情况下,将产生一个异常。然而,您仍然必须关闭连接以便将其释放到连接池里面。
事务支持
连接对象根据事务上下文从连接池中被拖出并分配。对连接的请求的线程的上下文必须和分配到的连接相匹配。因此,每个连接池实际上会被细分为多个与事务上下文无关的连接对象,以及N个小部分,每一部分都包含一个与特定的事务上下文相关的连接对象。
当一个连接被关闭时,将被释放回连接池并且根据其自身的事务上下文进入相应的子部分。因此,你可以关闭这个连接而不产生错误,即使有一个分布式的事务仍在挂起。这允许你在稍后提交或者放弃这个分布式的事务。
使用连接字符串关键字控制连接池
SqlConnection对象的ConnectionString属性支持连接连接字符串的键/值对,可以用来调整连接池的行为逻辑。
下面的表描述了你可以使用来调整连接池行为的ConnectionString值:
名称
默认值
描述
Connection Lifetime
0
当连接返回到连接池时,将比较其创建的时间和当前时间,如果时间片(秒)超过了由Connection Lifetime指定的值的话,该连接将被销毁。这用于集群配置以促使在正在运行的服务器与刚开始运行的服务器(a server just brought online)之间达到负载平衡。
值为零(0)将使池化连接有最大的超时值。
Connection Reset
'true'
决定当数据库连接从连接池中被移除时是否要被重置。对SQL Server7.0,设置为false可以避免在获得连接时一个额外的服务器往返,但是您必须了解到连接的状态,比如数据库上下文,并没有被重置。
Enlist
'true'
如果为true,并且创建线程中存在事务上下文,连接池自动从中获得连接对象。
Max Pool Size
100
连接池中允许的最大连接数目
Min Pool Size
0
连接池中维持的最小连接数目
Pooling
'true'
如果为true,连接对象将从合适的连接池中被拖出,或者需要的话被创建并添加到合适的连接池中
连接池的性能计数器
.NET框架的SQL Server数据提供程序添加了一些性能计数器来允许您调整(fine-tune)连接池特性,监测失败的连接尝试相关的间歇性问题,以及与SQL Server连接超时的请求相关的问题。
下面的表列出了可以被性能监视器从” .NET CLR Data”对象下访问的连接池计数器。
计数器
描述
SqlClient: Current # of pooled and non pooled connections
当前池化的和没有池化的连接数
SqlClient: Current # pooled connections
当前进程相关的所有连接连接池中的连接数
SqlClient: Current # connection pools
当前进程相关的所有连接池数
SqlClient: Peak # pooled connections
进程开始后所有连接池中连接数的最高值。注意:该计数器只有与特定进程关联时才可用。_Global实例将总是返回0
SqlClient: Total # failed connects
任何原因尝试打开连接失败的所有连接总数
注意:当与ASP.NET应用程序一起使用.NET框架SQL Server数据提供程序性能计数器时,只有_Global实例可用。因此,性能计数器返回的值是所有ASP.NET应用程序计数值的总和。