数据库连接池对性能的影响是什么?

3
我正在使用.Net 2.0 + SQL Server 2005 Enterprise + VSTS 2008 + C# + ADO.Net来开发ASP.Net Web应用程序。这个ASP.Net Web应用程序是以数据库为中心的/驱动的。我想知道是否有任何性能参考数据,关于在ADO.Net连接字符串设置中启用/禁用线程池设置时性能差异是什么?性能指的是可以支持的并发连接和从ADO.Net客户端执行的特定SQL命令的执行时间?
谢谢! George
4个回答

4
我手头没有任何性能统计数据,但是在使用连接池时可能需要警惕:你可能会得到太多的小连接池,而不是一个大的连接池。
ADO.NET将为每个连接字符串创建一个新的连接池;它对此非常挑剔——即使你有两个仅仅由一个空格或其他东西区分的连接字符串,这些都被视为两个独立的连接字符串,并将导致创建独立的连接池。
如果使用“集成安全性”(受信任的连接)设置,则为每个Windows凭据创建一个新的连接池。
因此,如果你有一个类似以下的连接字符串:
server=MyDBServer;database=MyDatabase;integrated security=SSPI;

每个可区分的用户将创建一个连接池 - 这相当反直觉,但事实就是这样(无法影响/关闭)。
请查看ADO.NET连接池的MSDN文档以获取详细信息:

当首次打开连接时,将基于精确匹配算法创建连接池,并将其与连接中的连接字符串相关联。每个连接池都与唯一的连接字符串相关联。当打开新连接时,如果连接字符串与现有池不完全匹配,则会创建新池。连接按进程、应用程序域、连接字符串和使用集成安全性时(如果使用),按Windows标识池化。连接字符串也必须完全匹配;对于相同连接提供的以不同顺序提供的关键字将被单独池化。

此外,如果您有这两个连接字符串:
server=MyDBServer;database=MyDatabase;user id=tom;pwd=top$secret

并且

server=MyDBServer;database=MyDatabase;user id=tom; pwd=top$secret;

这些被视为不同的连接字符串,因此会创建两个独立的连接池。

在尝试衡量连接池效果时,需要注意这一点!

Marc


4
性能差异因应用程序而异,因此没有硬数据可供参考。最好的做法是通过对应用程序进行压力测试,配置启用/禁用池化,以查看其表现,并进行测量。WCAT 是一种可用于加载ASP.NET应用程序的压力测试工具。您还可以尝试使用分析器(有许多种)来监视应用程序在压力下的性能表现。一些分析器: ANTS, dotTrace

1
你推荐的性能分析工具确实很棒。但是它们不是免费的。:-)有没有微软提供的工具(我有MSDN许可证,所以我认为我可以使用任何微软的非免费工具,因为许可证已经覆盖了),或者免费的工具? - George2

2

编写一个小程序来访问数据库。打开数据库连接并循环100次,不要关闭它。

  1. 监控每次获取数据所需的时间。
  2. 使用'netstat -a'监视服务器端连接。
  3. 使用/不使用连接池。

你能详细描述一下为什么我们需要第二步,以及你希望第二步证明什么吗? - George2
第二步用于监控在服务器端访问数据库所需的连接数。我的经验是,如果您使用连接池,则2或3个连接就足够了,但如果没有连接池,则可能会有很多连接,这取决于有多少并发用户。 - Henry Gao

2
您说的是“线程池”,但显然您所说的是连接池,正如您的标题所示。
创建新的数据库连接会产生性能开销。这是一个资源密集型操作,这就是为什么我们有ADO.NET连接池。实际上,连接不会被关闭,而是返回到池中,在其中保持活动状态,并可以被同一代码库(在AppDomain内部)的其他部分重用。
每个唯一的连接字符串都会创建一个ADO.NET应用程序池,因此值得注意的是,当您使用集成安全性时,您将失去连接池的好处,因为您将有效地拥有每个DB经过身份验证的用户一个连接池。

你说“线程池”,但是显然你的标题显示的是连接池。谢谢指出,我已经更正了我的帖子标题。 :-) - George2
我的问题不是关于数据库连接池的工作原理,而是有没有任何一般性的数据可以参考,比较使用和不使用数据库连接池的性能差异。有没有相关文档可以参考? - George2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接