【问题标题】:Opening and closing connections to SQL Server打开和关闭与 SQL Server 的连接
【发布时间】:2015-05-13 22:26:43
【问题描述】:

我在一个由大约十几个开发人员组成的小团队中工作,该团队使用 C# WPF 作为基础架构/dba 编写一个项目。当我对 SQL Server 运行跟踪以查看性能情况时,我看到的是一个常数:

打开连接 运行一些语句 紧密连接 执行 sp_reset_connection

打开连接 运行一些语句 紧密连接 执行 sp_reset_connection

打开连接 运行一些语句 紧密连接 执行 sp_reset_connection

等等等等。我已经与开发人员讨论过这个问题,有些人提到了 foreach 循环可能包含 using 语句的可能情况,因此通过数据表的 foreach 将打开和关闭整个数据表内容的连接。

问题:更好地控制连接的不断打开和关闭是一个有价值的目标,还是连接真的那么便宜?我的逻辑是,虽然打开和关闭连接可能相对便宜,但在数量足够多的情况下,没有什么是便宜的。

详情:

  • .Net Framework 4.5.1
  • SQL Server 2014
  • 实体框架 6

【问题讨论】:

    标签: c# entity-framework-6


    【解决方案1】:

    如果您使用实体框架,您应该在需要之前创建上下文并尽快处理它:

    using (var someContext = new SomeContext())
    {
    
    }
    

    原因是为了避免内存堆积和线程安全问题。

    当然,不要在循环中执行此操作 - 这是在请求级别。

    【讨论】:

      【解决方案2】:

      打开和关闭与数据库的连接相对昂贵,可以在此处详细阅读:Performance Considerations (Entity Framework),但我认为相同的概念大多适用于没有 EF。在循环期间,通常不建议每次都打开和关闭连接,而是打开它,处理所有行并关闭连接。

      答案是让using 包含循环,而不是相反。如果性能是相关的(几乎总是如此),那么将精力放在高效的数据访问上肯定是值得的,尤其是在开发过程的早期。

      【讨论】:

        【解决方案3】:

        如果性能是一个问题,但您不想重构代码,您应该考虑在连接字符串中设置ConnectionPooling = true

        连接池允许在处理逻辑连接的同时保持物理连接,这通常设置成本很高。

        【讨论】:

          猜你喜欢
          • 2010-10-26
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多