数据库连接池如何影响性能?

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

感谢avvance,乔治

我手边没有任何性能统计数据,但在使用连接池时可能会发出警告:您可能最终会得到太多的小池,而不是一个大池。

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; 

那些被认为是不同的连接字符串,因此将创建两个单独的连接池。

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

从应用程序到应用程序,性能差异会有很大差异,因此没有关于您应该期望获得什么样的收益的硬数据。

通过对应用程序进行压力测试,使用/不使用池进行压力测试,看看它是如何展开的,这是最好的行动方案。

WCAT是一种可用于加载ASP.NET应用程序的压力工具。

您还可以尝试使用分析器(其中有很多分析器)来监视您的应用程序,以了解它在压力下的性能。

一些Profilers: ANTS , dotTrace

写一个小的progeam来访问数据库。 打开数据库连接而不关闭它并循环100次。

  1. 监控每次获取数据所需的时间。
  2. 使用’netstat -a’监控服务器端连接
  3. 有/无合并

你说’线程池’,但显然是在谈论连接池,如标题所示。

创建新数据库连接存在性能开销。 这是一个资源密集型操作,这就是我们拥有ADO.NET连接池的原因。 有效连接不会关闭,而只是返回到它们保持活动状态的池中,并且可以由相同代码库的其他部分(在AppDomain内)重用。

一个ADO.NET应用程序池是创建PER唯一连接字符串,因此值得注意的是,当您使用集成安全性时,您将失去连接池的好处,因为每个DB身份validation用户将有效地拥有一个连接池。