【问题标题】:sqlconnection pooling problemsql连接池问题
【发布时间】:2011-06-08 14:12:21
【问题描述】:

您好,我有一个 Web 应用程序 (asp.net),我们刚刚开始收到“System.InvalidOperationException: Timeout expired”。尝试获取新的 sql 连接时。

所以我猜想在代码中的某个位置创建了一个连接但从未释放,但我将如何去找到发生这种情况的位置?遗憾的是,大多数数据库通信不使用数据层,它直接与 sql 数据类型一起工作......

我可以在 web.config 中启用什么功能来跟踪哪些连接打开的时间超过 x 秒以及它们在哪里打开?

【问题讨论】:

    标签: asp.net sql-server ado.net connection-pooling


    【解决方案1】:

    找到使用你的 sqlconnection 的所有地方。确保它在 using() 块中以自动处理它。不幸的是,web.config 中没有内置任何内容。您也许可以尝试使用 ant 内存分析器来帮助追踪这一点。例如: http://www.developerfusion.com/review/59466/ants-memory-profiler-51/

    【讨论】:

    • 嗯,这或多或少会像 1000 个地方一样分散在整个应用程序中
    • 使用 Visual Studio 查找所有“SqlConnection”。您可以在几分钟内轻松扫描 1000 个列表,以找出哪些未与“使用”语句在同一行实例化 - 除非开发人员专门对它们调用 .dispose(假设为 c#)而不使用“使用” ' stmt。如果是这样,找到并打那个开发商。请参阅上面的 ANTS 编辑
    【解决方案2】:

    好的,我找到了一种方法来使用

    执行 SP_WHO2
    DBCC 输入缓冲区(SPID)

    SP_WHO2 为您提供有关连接的信息,通过使用 DBCC INPUTBUFFER,您可以找出它们上次运行的命令。

    【讨论】:

      【解决方案3】:

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

      • 性能计数器可以显示连接池的利用率
      • SQL Server Management Studio 可以显示正在使用的连接、它们的活动和最后执行的语句。在对象资源管理器中选择服务器,然后在上下文菜单中转到 Reports > Standard Reports > Activity xxx

      另一种方法是关闭池并使用一些分析器来收集有关您的应用程序的信息并跟踪未处理的连接。

      【讨论】:

      • 我将如何跟踪未处置的连接??
      • 它们将在几分钟内处于非活动状态,您必须跟踪应用程序中调用的最后一个 sql 命令的位置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2012-09-25
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多