SQLServer .NET Data Provider的Connection Pooling
SQLServer .NET Data Provider的Connection PoolingPooling 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. conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs"; conn.Open(); // Pool B is created because the connection strings differ. 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 Pool的性能记数器 SQL Server .NET Data Provider添加了一些性能记数器使用户可以调整connection pool特性。下面是一些记数器:
|