木头象

人生如棋局

导航

SQLServer .NET Data Provider的Connection Pooling

SQLServer .NET Data Provider的Connection Pooling

Pooling connection连接可以极大促进应用程序的性能与可扩展性。SQL Server .NET Data Provider自动提供connection pooling。用户也可以自己提供一些连接字符串修饰符来控制connection pooling。

Pool的创建与指定

当连接打开时,基于精确匹配算法的一个connection pool被创建,这个算法将pool和这个连接的连接字符串相关联。在新连接打开时,如果连接字符串不精确匹配一个已存在的pool,新pool被创建。下例中,三个新的SqlConnection对象被创建,但只有两个connection pool要求管理它们。注意,第一个和第二个的连接字符串由所指定的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.

只要创建了connection pool,还有活动进程时connection pool就存在。维持不活动的和空pool的系统开销很小。

添加Connection

每个独立的连接字符串对应一个connection pool。当pool创建时,多个连接对象被创建并被加至pool中以保证最小的pool数。连接可以一直添加,直到邮大的pool大小。当SqlConnection对象被请求时,如果当前连接可用,我们可以从pool中获得它。为了可用,连接必须当前不被使用,而且必须有一个对应的连接上下文,并拥有一个与服务器的有效连接。如果达到最大的池大小而无可用的连接,请求被缓冲于队列中。对象pooler可以在有可用连接时再进行分配。如果超时后仍然没有可用连接会产生一个错误。注意:必须在使用后关闭连接,这可以通过close或dispose方法关闭连接。不显式关闭连接,连接不会自动被系统回收。

Connection的删除

如果连接的生存期到达或连接已经得到服务时,pooler将删除此对象。这个过程是在试图连接服务器后得到的。如果发现一个连接不再连接到服务器,标记它为无效。Pooler定期扫描标记无效的连接,这些连接以后会被永远删除。如果连接到的服务器消失,此连接会被移回pool中,即使它不被标记为无效。在此过程中会产生一个异常。此时用户仍然必须显式关闭连接以使它回到pool中。

支持操作

pool中抽取的Connection基于操作上下文。请求线程的上下文和指定的连接必须匹配。因此每个connection pool实际上被分为无上下文连接的连接和另外N 个和特定上下文相连的连接。当连接关闭时,它返回pool并根据相应的操作上下文返回到相应的区中。因此用户可以安全地关闭一个连接,即使一个分布式连接仍然被挂起。这允许用户在其后忽略或终止一个分布式进程。

以连接字符串关键字控制Connection Pool

ConnectionString属性是SQLConnection 对象的一个属性,它支持一个连接串/值对,这个对是用于调整connection pool行为的。下表是ConnectionString 的值及解释。

名称

默认值

描述

Connection Lifetime

0

当连接返回pool时,它的时间和创建时间相比,如果它的存在时间超过了Connection Lifetime,它被释放。这对于新加入集群的服务器平衡是很有用的。值0可以保证连接有最大时限。

Connection Reset

'true'

决定从pool移走时数据库连接是否被重置。

Enlist

'true'

truepooler自动列出当前创建线程的操作上下文,如果操作上下文存在的话。

Max Pool Size

100

Pool中允许的最大连接数。

Min Pool Size

0

Pool中允许的最小连接数。

Pooling

'true'

true时,连接从相应的pool中被取出,如果需要将创建或添加到相应的池中。

Connection Pool的性能记数器

SQL Server .NET Data Provider添加了一些性能记数器使用户可以调整connection pool特性。下面是一些记数器:

记数器

描述

SqlClient: 缓冲的和非缓冲的连接数

当前的连接数

SqlClient: 当前缓冲的连接数

在池中与当前进程关联的所有连接

SqlClient: 当前connection pool数

与当前进程连接的池数

SqlClient: 最大缓冲连接数

从进程开始以来使用的最大连接数。此记数器只有在与特定进程关联时才有意义。_Global 实例总返回0

SqlClient: 总失败连接数

失败总数

posted on 2004-02-04 17:19  木头象  阅读(2131)  评论(1编辑  收藏  举报