【发布时间】:2015-05-31 11:55:38
【问题描述】:
Linq to Sql 会自动关闭连接吗?或者我应该使用using?
var db = new DataContext();
// Codes
或
using (var db = new DataContext())
{
// Codes
}
【问题讨论】:
标签: c# linq-to-sql
Linq to Sql 会自动关闭连接吗?或者我应该使用using?
var db = new DataContext();
// Codes
或
using (var db = new DataContext())
{
// Codes
}
【问题讨论】:
标签: c# linq-to-sql
当您使用using 语句时,连接将被自动管理。DataContext 类实现了IDisposable 接口,因此您需要随时在DataContext 实现上调用 Dispose看完了。
我们实施 IDisposable 有几个原因:
- 如果应用程序逻辑需要在 DataContext 预期使用或有效时间之外保留实体,您可以强制执行该操作
通过调用 Dispose 签订合同。该实体中的延迟加载程序将
仍在引用 DataContext 并会尝试使用它(如果有)
代码尝试导航延迟的属性。这些尝试
将失败。 Dispose 还强制 DataContext 转储其缓存
实体化实体,以便单个缓存实体不会
意外地让所有通过它具体化的实体保持活力
DataContext,否则会导致看起来像内存
泄漏。- 自动关闭 DataContext 连接的逻辑可能会被欺骗,使连接保持打开状态。 DataContext 依赖 在枚举查询的所有结果的应用程序代码上,因为 到达结果集的末尾会触发连接关闭。 如果应用程序使用 IEnumerable 的 MoveNext 方法而不是 C#或VB中的foreach语句,可以退出枚举 过早地。如果您的应用程序遇到问题 连接未关闭,您怀疑自动关闭 行为不起作用,您可以将 Dispose 模式用作工作 周围。
【讨论】:
.Dispose()关闭连接?
Close()实际上调用了Dispose(),但是using语句会自动调用资源上的dispose,所以只要使用using就可以了,不要害怕关闭或者dispose。
using 版本是您能做的最好的。底层连接没有关闭,这是一件好事。连接保存在一个池中,以便它们可以被回收。
不要将您的代码关闭连接与实际的底层物理连接混淆。
您必须关闭连接,处理此问题的最佳方法(最佳实践)是using 语句。
【讨论】:
... } finally { this.conManager.ReleaseConnection(this); } return result; } 它是什么?它确切地说 linq to sql 在任何执行后关闭连接..