2011-06-08 82 views
0

嗨,我有一个Web应用程序(asp.net),我们刚刚开始得到“System.InvalidOperationException:超时过期。”当试图获得一个新的SQL连接。sqlconnection池问题

所以我猜一些在代码中的连接创建但从来没有处置,但我会怎么去找到这种情况?可悲的是,大多数数据库通信不使用数据层,它直接与SQL数据类型一起工作...

是否有任何事情我可以在web.config中启用,以跟踪哪些连接打开时间更长,然后x秒和他们在哪里打开?

回答

2

好吧,我发现了一种通过跟踪他们失望

EXEC SP_WHO2
DBCC INPUTBUFFER(SPID)

SP_WHO2为您提供有关连接和使用DBCC INPUTBUFFER你可以找出命令信息他们上次跑了。

2

无处不在你的sqlconnection被使用。确保它位于using()块中以自动处理它。不幸的是,web.config中没有内置任何内容。您可能可以尝试使用蚂蚁内存分析器来帮助追踪此情况。例如: http://www.developerfusion.com/review/59466/ants-memory-profiler-51/

+0

好吧,或多或少会像1000个地方散落在整个应用程序 – Peter 2011-06-08 14:21:27

+0

使用Visual Studio来查找所有“SqlConnection”。你可以在几分钟内轻松扫描一个列表,找出哪些没有在'using'语句的同一行上实例化 - 除非开发人员特别调用.dispose(假设c#),而不是使用'using 'stmt。如果是这样,找到并打击该开发人员。请参阅上面的ANTS编辑 – 2011-06-08 14:23:17

1

.NET框架无法解决您的架构和日志记录问题,因此您必须自己找到问题。有什么可以帮助您:

  • 性能计数器可以告诉你连接池的利用率
  • SQL Server Management Studio中可以告诉你最后执行的语句中使用他们的活动连接和。在对象资源管理器中选择服务器,并在上下文菜单转到报告>标准报告>活动XXX

另一种方法是关闭游泳池和使用一些Profiler来收集有关应用程序的信息和跟踪未设置连接。

+0

我将如何跟踪未处理的连接? – Peter 2011-06-09 06:36:31

+0

它们将在几分钟内不活动,您将不得不跟踪应用程序中调用的最后一个sql命令的位置。 – 2011-06-09 06:43:40