打开和关闭与SQL Server的连接

时间:2015-05-13 14:07:40

标签: c# entity-framework-6

我在一个由十几个开发人员组成的小团队中工作,他们使用C#WPF作为基础架构/ dba编写。当我针对SQL Server运行跟踪以查看性能如何时,我看到的是一个常量:

打开连接 发表一些声明 密切联系 exec sp_reset_connection

打开连接 发表一些声明 密切联系 exec sp_reset_connection

打开连接 发表一些声明 密切联系 exec sp_reset_connection

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

问题:是否可以更好地控制连接的持续打开和关闭,这是一个有价值的目标,还是连接真的那么便宜?我的逻辑是,虽然打开和关闭连接可能相对便宜,但是当以足够大的数量完成时,没有什么是便宜的。

详细说明:

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

3 个答案:

答案 0 :(得分:1)

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

using (var someContext = new SomeContext())
{

}

原因是避免内存积累并避免线程安全问题。

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

答案 1 :(得分:0)

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

答案是让using包含循环,而不是相反。如果性能是相关的(它几乎总是如此),它肯定会付出努力来进行有效的数据访问,特别是在开发过程的早期。

答案 2 :(得分:0)

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

连接池允许在处理逻辑连接时保持物理连接,这通常很昂贵。