6

我正在调查在负载下失败的 MVC3 应用程序中的此错误:

“在从池中获取连接之前已经过了超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。”

该应用程序正在使用存储库模式和实体框架,我的直觉是它没有正确关闭连接。我希望能够监视 SQL Server 上的池连接数。搜索让我相信我可以在 Perfmon 中使用这些计数器:

  • .NET CLR 数据
  • SQLServer 的 .NET 数据提供程序

但是,它们都显示并被禁用/变灰。

我直接在服务器上运行 Perfmon,并且 ISS 和 SQL Server 都在服务器上运行。任何想法为什么这些计数器不可用?

我也尝试使用 SQL Profiler 来监控池连接,但 EventSubClass 列不可用于 AuditLogin。

4

2 回答 2

7

您可以从 SQL 查询窗口运行此程序,以获取 SQL 服务器上运行的当前连接和会话的计数和详细信息。

select * FROM sys.dm_exec_sessions AS es  
INNER JOIN sys.dm_exec_connections AS ec  
ON es.session_id = ec.session_id

我在池连接方面遇到了麻烦。他们很难控制。由于它们在.NET 的控制下,因此显式关闭它们似乎从未起作用。我们用完连接的最大原因是未提交的事务。如果由于某种原因未提交或回滚事务,则连接不会被重新使用,而是陷入困境,迫使 .NET 打开另一个连接以继续处理。

于 2013-08-16T10:50:23.580 回答
1

从 SQL 方面来看,唯一可行的方法是设置登录事件跟踪。“事件子类”列将告诉您事件是否使用池连接发生。有了它,您可以关联主机、登录名和应用程序名称并继续挖掘。

审计登录事件类

在应用程序端,您可以在 perfmon 上使用“.NET DATA PROVIDER FOR SQL SERVER”的性能计数器。

ADO.NET 中的性能计数器

于 2015-10-10T16:12:40.027 回答