如何利用ADO.NET的连接缓冲池

缓冲池简介

建立数据库连接分几个步骤。首先,要与网络数据库服务器建立连接。接着,解析连接字符串并对用户进行验证。最后,建立连接并执行操作。连接缓冲池允许应用程序维持一个数据库连接的所有权。

连接缓冲池维持一组(或一池)活动数据库连接。当一个应用程序试图打开一个数据库连接时,缓冲池(如可用)恢复一个开放的连接。关闭连接则将它返回到缓冲池给其他进程使用。

ADO.NET缓冲池连接拥有同样的连接或配置(连接字符串)。它能维持一个以上的缓冲池(实际上,每个配置一个缓冲池)。有用的提示:除非另有说明,(默认情况下)程序利用连接缓冲池。如果你关闭或中断所有连接,那么就没有缓冲池(因为没有有效的连接)。

虽然保持数据库连接一直开放会引起麻烦,但由于这样不必再次打开连接,所以对于应用程序与数据库之间的即时通信会有好处。一些数据库管理员可能并不赞成这一做法,因为数据库同时打开了几个连接(但并非所有连接都有用)。要根据有效的服务器资源与应用程序需求(即是否确实有需要)来应用连接缓冲池。

应用连接缓冲池

默认情况下,连接缓冲池处于活动状态。你也可以通过修改连接字符串中的缓冲池设置来撤销默认行为。下面的SQL Server连接字符串并未利用连接缓冲池。

Data Source=TestServer;Initial Catalog=Northwind;

User ID=Chester;Password=Tester;Pooling=False;

其它.NET数据供应者(Data Provider)也可以使用同样的方法。你可以将其值设为真(或除掉Pooling变量使用默认行为)来激活它。另外,连接缓冲池的默认大小为100,但你也可以用连接字符串变量来修改它。你可以用下面的变量来控制缓冲池的最大与最小值,以及事务支持:

下面的SQL Server连接字符串使用了一个连接缓冲池,其最大连接数目为100,最小连接数目为5:

Data Source=TestServer;Initial Catalog=Northwind;

User ID=Chester;Password=Tester;Max Pool Size=50;

Min Pool Size=5;Pooling=True;

使用链接缓冲,可以改善性能……
默认情况下,连接缓冲是被开启的……只有用完全一样的链接字符串打开的那些链接才被放入相同的缓冲池。可以在连接字符串中加入下连选项来设置连接缓冲……
Connection Lifetime    在指定的秒数之后销毁链接。默认值是0,表示永远不销毁链接。
Connection Reset       指出当连接被放回链接缓冲池时是否应该被复位,默认值是true
Enlist           指出链接是否应该自动参与当前的事务环境。默认值是true。
Max Pool Size      单个链接缓冲池中允许最大的链接数。默认是100。
Min Pool Size      单个链接缓冲池中允许的最小链接数。默认值是0.
Pooling         决定是否启用链接缓冲。默认是true。
 

如果你使用.NET Data Provider而非SQL Server,就应该参考文件资料。其他的Data Provider可能拥有更多的缓冲池选项。Oracle Data Provider是一个典型的例子,它提供两个控制连接池缩小或增大的选项——Decr Pool Size和Incr Pool Size。

微软文件规定,连接缓冲池通过对释放出缓冲池的连接进行再分配,从而满足连接需求。如果缓冲池已达到最大,且没有可用的连接,则请求排队等候。在超时时间(默认为15秒)到达前,缓冲池会设法回收利用连接。如果在连接超时前,缓冲池无法满足需求,就会产生异常。

缓冲池使用建议

使用连接缓冲池时应保持谨慎。以下是使用时的几点提示:

  • 只有在需要时才打开连接。也就是说,及时打开连接。所以,要在需要时打开连接,不早也不晚。还有,操作完成后立即关闭连接,不要等到垃圾收集器来关闭连接。
  • 在关闭相关连接前,关闭用户定义的事务。
  • 要维持连接缓冲池,必须保持至少开放一个连接。因此,不要关闭缓冲池中的所有连接。如果服务器资源出现问题,你可以关闭所有连接;那么,下一个请求将重建缓冲池。
  • 在采用集成安全机制时,不要使用连接缓冲池。这样做会为每个用户建立一个独特的连接字符串,于是每个用户拥有一个连接缓冲池,但其他用户却不能使用。最终使性能降低,所以在这种情况下要避免使用缓冲池。

ADO.NET 2.0

ADO.NET 2.0推出了两个与连接缓冲池有关的新方法——ClearAllPools和ClearPool。ClearAllPools为一个指定的提供者清除连接缓冲池;ClearPool则清除与特定连接有关的连接缓冲池。如果在调用上述两个方法时,有连接在使用之中,则对它们打上适当的标记。当连接关闭后,就将它们抛弃,而不是返回到缓冲池中。

其它应用选项

整理数据库资源专栏后,是一个简述连接缓冲池的专栏,这似乎有些奇怪。问题的关键在于了解可用的连接,并根据应用程序需求对它们加以应用。如果应用程序与数据库保持即时通信,那么连接缓冲池就成为最佳选择,因为此时不需要打开/建立连接,性能也因此得到提高。另一方面,夜晚运行的应用程序不必维持缓冲池,因为它在白天时不需要数据库。在决定是否应用连接缓冲池时,做出明智的判断。

 

你可能感兴趣的:(Asp.net)