2015-05-13 117 views
1

我正在一个由十几位开发人员组成的小团队中,这个团队是使用C#WPF作为基础结构/ dba编写的。由于我对运行SQL Server跟踪,看看性能是怎么回事,我所看到的是一个常数:打开和关闭连接到SQL Server

开放连接 运行一些语句 紧密结合 的exec sp_reset_connection的

开放连接 运行一些语句 密切联系 的exec sp_reset_connection的

开放连接 运行一些语句 紧密结合 的exec sp_reset_connection的

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

问:越来越恒开的更好的控制和连接关闭一个有价值的目标或为连接真的那么便宜?我的逻辑是,虽然打开和关闭连接可能相对便宜,但如果数量足够多,则没有什么是便宜的。

详情:

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

回答

0

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

答案是让using涵盖,而不是周围的其他方式的循环。如果性能是相关的(几乎总是这样),那么在开发过程的早期就需要投入有效的数据访问。

1

如果使用实体框架,你应该在你面前创建上下文需要它,并尽快处置它可能:

using (var someContext = new SomeContext()) 
{ 

} 

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

当然,不要在循环中这样做 - 这是在请求的级别。

0

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

连接池允许一个保持物理连接,这通常是昂贵的设置,而设置逻辑连接。