【问题标题】:Linq-to-SQL and sp_reset_connectionLinq-to-SQL 和 sp_reset_connection
【发布时间】:2011-11-18 11:16:22
【问题描述】:

我有一个 .NET 4.0 Winform 和一个 .NET 4.0 Windows 服务,它们都通过 LINQ to SQL 连接到 SQL 2005/2008 数据库。它在我们的测试环境中运行良好且快速,具有完美的生产数据克隆,但在生产环境中,它运行非常缓慢,并且 CPU 使用率和带宽使用率很低。我还注意到每天有数百次 SQL 超时,即使对于索引良好的数据库上的最小查询也是如此。所以我启动了 Profiler...

我发现在负载下的 10 分钟捕获期间,sp_reset_connection 占总 SQL CPU 持续时间的三分之一和总 SQL 调用的 90%。

  • 我已尝试禁用和启用连接池,并调整连接字符串中允许的连接数和连接超时。没有任何效果。
  • 当我遇到 LINQ 查询时,我一直在用 ADO.NET 查询替换它们。这些旧的 ADO.NET 查询永远不会超时。只有 LINQ。
  • 我注意到该服务器上的其他主要性能问题,但我不确定如何与客户的系统管理员联系。
  • 我对运行该服务的应用程序服务器具有管理员访问权限。我几乎无法访问他们运行 Winform 的终端服务器,也无法访问 SQL 服务器。

  • 是什么导致 sp_reset_connection 如此频繁地运行?

  • 有没有一种方法可以绕过这些调用,而不会从我的应用程序中删除所有 LINQ?
  • 有没有办法减少对该存储过程的调用次数?
  • 有没有办法减少 SQL Server 执行这些调用所需的处理器时间?
  • 如果我禁用池并将存储的过程替换为一个空的过程,我会搞砸什么吗?

【问题讨论】:

    标签: c# sql linq-to-sql query-optimization connection-pooling


    【解决方案1】:

    找到了一些关于这个的其他页面,其中一个建议是这样的:

    对于您的连接重置,在使用它之前打开您的 DataContext 连接并在最后关闭它。

    db.Connection.Open()
    ... work...
    db.Connection.Close()
    

    【讨论】:

    • using 块中的每个命令之后都会出现数据上下文问题sp_reset_connection,除非您手动打开连接(这是我从未真正做过的事情,因为它违反直觉)或有环境交易(我一直都有,所以它对我有用,我什至不知道为什么)。你能给一个“其他页面”的链接吗?想要一些关于这种行为的文档。
    【解决方案2】:

    sp_reset_connection 在sqlconnection返回连接池时发生,现在应该没有问题了。

    但现在的问题是为什么会出现超时?是 sql server 无法处理事务量还是连接池耗尽,从未使用过 Linq-to-sql 但确保在处理完对象后处理所有可以处理的东西......

    编辑:连接池的存在是有原因的,删除它可能会降低您的性能,删除“sp_reset_connection”会给您带来奇怪的错误,因为数据将被转移到连接的下一个用户......

    要降低 sp_reset_connection 的数量,您可以做的唯一方法是尝试为尽可能多的查询重用相同的连接!

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      相关资源
      最近更新 更多