我在一个由十几个开发人员组成的小团队中工作,他们使用C#WPF作为基础架构/ dba编写。当我针对SQL Server运行跟踪以查看性能如何时,我看到的是一个常量:
打开连接 发表一些声明 密切联系 exec sp_reset_connection
打开连接 发表一些声明 密切联系 exec sp_reset_connection
打开连接 发表一些声明 密切联系 exec sp_reset_connection
依此类推。我已经与开发人员谈过这个问题,有些人提到了foreach循环可能包含using语句的可能情况,因此foreach通过数据表可以打开和关闭数据表内容的连接。
问题:是否可以更好地控制连接的持续打开和关闭,这是一个有价值的目标,还是连接真的那么便宜?我的逻辑是,虽然打开和关闭连接可能相对便宜,但是当以足够大的数量完成时,没有什么是便宜的。
详细说明:
答案 0 :(得分:1)
如果您使用实体框架,您应该在需要之前创建上下文并尽快处理它:
using (var someContext = new SomeContext())
{
}
原因是避免内存积累并避免线程安全问题。
当然,不要在循环中执行此操作 - 这是在请求级别。
答案 1 :(得分:0)
打开和关闭数据库的连接相对昂贵,可以在这里详细阅读:Performance Considerations (Entity Framework),但我认为相同的概念主要适用于没有EF的情况。在循环期间,通常不建议每次打开和关闭连接,而是打开它,处理所有行并关闭连接。
答案是让using
包含循环,而不是相反。如果性能是相关的(它几乎总是如此),它肯定会付出努力来进行有效的数据访问,特别是在开发过程的早期。
答案 2 :(得分:0)
如果性能有问题,但您不想重构代码,则应考虑在连接字符串中设置ConnectionPooling = true
。
连接池允许在处理逻辑连接时保持物理连接,这通常很昂贵。