我需要在 LINQ 查询后强制 Dispose 吗?

Do I need to force a Dispose after a LINQ query?

我的 DBA 说打开的连接太多,他认为是我在 .net 中的代码导致它们打开。

我首先使用 LINQ 查询和 EF 代码。

示例方法:

 public List<Stuff> GetStuff()
 {
      var db = new DBContext();

      var results =  db.stuff.toList();

      return results;
 }

完成后是否需要处理数据库变量?我的理解是我不需要在 EF 和 LINQ 中这样做。请向我指出有关在代码中管理连接或 LINQ/EF 和数据库连接

的最佳实践的 Microsoft 文档

更新:

我加了

db.Connection.Close();
db.Dispose();

并且在执行完这两行后,我仍然在 SQL 中看到打开的连接。有什么原因导致我强行关闭它不关闭吗?

默认情况下,DbContext 会自动为您管理连接。因此,您不必显式调用 Dispose。

关于以下主题的博客 post:Link

但我相信如果您正在处理大量请求,则不处置会导致性能问题。您应该添加一个 using 语句以查看它是否会导致您的情况出现问题。

您应该听听 DBA 的意见!是的,使用 using。不要让连接在不必要的情况下保持打开状态。您应该连接,使用数据库处理您的业务,然后关闭该连接,为另一个进程释放它。在大容量系统中尤其如此。

编辑。让我在这里以我自己的经历进一步说明。在小批量处理中,这可能不是问题,但不显式处理或不处理某些东西是一个坏习惯——当它明确实现 IDisposable.[=13= 时将其包装在 using 中]

在大批量的情况下,这简直是自找麻烦。 Sql 服务器将为每个应用程序分配如此多的连接(可以在连接字符串中指定)。如果没有立即关闭,进程将花费时间等待连接释放。在某些情况下,这通常会导致超时或死锁。

当然,您可以调整 Sql 服务器连接管理等,但每次调整设置时,您都在做出妥协。您必须考虑备份 运行、其他工作 运行 等。这就是为什么明智的开发人员会听从他们的 DBA 的警告。这并不总是关于代码...

我刚问了这个same question over on Programmers.SE。罗伯特哈维给出了一个很好的答案。

In general, you don't need to use Using statements with Entity Framework data contexts. Lazy collections is one of the reasons why.

我鼓励您阅读 Programmers.SE 上的完整答案以及罗伯特在答案中提供的链接。

是的,如果您的方法定义了一个工作单元;不,如果是更原始的东西。 (P.S。你的代码中某处应该定义一个工作单元,并且那个东西应该包含在 using (var context = new DbContext()) {} 或等价物中。)

如果您属于这样一种观点,即您的 DbContext 您的工作单元,那么您将永远用 [= =12=] 块:在上下文生命周期中先前获取的数据的本地缓存与 SaveChanges 方法一起充当一种轻量级事务,并且您的 Dispose(不调用 SaveChanges)是你的回滚(而你的 SaveChanges 是你的提交)。

据我所知,entity framework 默认使用 connection pooling 来减少每次创建新连接的开销。 关闭应用程序时连接是否关闭?

如果是这样,您可以尝试减小连接字符串中的最大池大小或完全禁用连接池。 有关连接字符串中可能选项的参考,请参阅 here

看看这个,这是关于如何使用 IDisposable 对象的标准协议。 https://msdn.microsoft.com/en-us/library/yh598w02.aspx

它说:

"As a rule, when you use an IDisposable object, you should declare and instantiate it in a using statement."

由于他们可以访问非托管资源,因此您应该始终考虑 "using" 声明。