SQL Server connection pooling



晚上好!

我仍然怀疑asp.net连接池。我工作的应用程序有时会抛出异常"达到最大池大小"。

我的团队反复查找一些泄漏的代码,但一无所获。

但是,现在我开始怀疑了。当它说"达到了最大池大小"时,这是否意味着数据库或服务器达到了最大的池大小?

如果SQL Server为几个不同的asp.net应用程序托管多个数据库,那么这些其他数据库是否会干扰我的数据库(我的数据库在同一SQL Server中)。例如,如果有一些应用程序连接泄漏,这种泄漏会在我的应用程序中产生"最大池大小"吗?

谢谢!

ADO.NET为每个连接字符串维护单独的连接池组。因此,如果您有多个数据库,它们应该有自己的池,并且这些池不应该相互干扰。

是否可能有些请求需要很长时间?如果对单个数据库同时执行了足够多的请求,并且这些请求被延迟,那么连接池可能真的只是因为打开了连接而被访问的。

为了验证情况并非如此,您可以通过执行sp_who或运行SQL Server活动监视器来检查数据库上正在运行的内容。

您还可以查询数据库中的DMV,以查看数据库打开的各种程序的连接数:

select
NULL as [Connections by Database],
[host_name] as [Client Machine],
DB.name as [Database],
[program_name] as [Client Program],
COUNT(*) as [Open Connections]
from sys.dm_exec_sessions s (nolock)
left join sys.dm_exec_requests r (nolock)
on r.session_id = s.session_id
left join sys.databases DB (nolock)
on DB.database_id = r.database_id
where s.session_id >= 50 -- Ignore SQL Server processes
group by [host_name], DB.name, [program_name]
order by [Client Machine], [Database], [Client Program]

如果你确实发现你只需要更多的连接,你可以通过将属性"最大池大小"设置为100以外的值来调整连接字符串中的限制。下面是一个例子。

如果您想了解是哪个池导致了问题,可以在调试堆中挖掘.NET对象。您必须捕获w3wp.exe进程的内存转储,并使用WinDbg(或可能的调试诊断工具)等工具对其进行分析。我过去也这样做过。这不一定很容易,但它可以帮助很多。

编辑

ADO.NET连接池有一个perfmon计数器,可用于监视泄漏的连接。在性能监视器中,cxpan和SqlServer的.NET数据提供程序,并添加计数器NumberOfReclaimedConnections。根据文件,此计数器的意思是:

通过垃圾回收的连接数集合,其中应用程序未调用Close或Dispose。未明确关闭或处理连接会影响性能。

我们已经使用此计数器来验证我们的应用程序是否存在连接泄漏。

最新更新