我正在从负载失败的MVC3应用程序中调查此错误:
“从池中获取连接之前已经过了超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。”
应用程序正在使用Repository模式和Entity Framework,我的预感是它没有正确关闭连接。我希望能够监视SQL Server上的池连接数。搜索引导我相信我可以在Perfmon中使用这些计数器:
然而,它们都显示并被禁用/变灰。
我直接在服务器上运行Perfmon,并且ISS和SQL Server都在服务器上运行。有什么想法为什么这些计数器不可用?
我也尝试使用SQL事件探查器来监控池化连接,但是AuditLog不能使用EventSubClass列。
答案 0 :(得分:6)
您可以从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打开另一个连接以继续处理。
答案 1 :(得分:1)
从SQL方面来说,唯一可行的方法是设置登录事件跟踪。 "事件子类"列将告诉您是否使用池连接发生了事件。有了它,您可以关联主机,登录名和应用程序名称并继续挖掘。
<强> Audit Login Event Class 强>
在应用程序端,您可以使用&#34; .NET DATA PROVIDER FOR SQL SERVER&#34;的性能计数器。在perfmon。