当与数据库连接对象一起使用时,using语句是否真的调用close方法? The MSDN documentation说它确保调用Dispose方法,但没有提到close。我看到Stack Overflow上的帖子,人们说它同时做到了。有人从微软或其他有效的证据中以这种或那种方式得到具体答案吗?
答案 0 :(得分:19)
这是SqlConnection类的“Dispose”方法:
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
如您所见,它确实调用了Close()
答案 1 :(得分:6)
如果使用using
语句,连接将被关闭,实现IDisposable的对象在垃圾收集后仍然保持打开状态是没有意义的......
但Close()
和Dispose()
不是一回事:
Dispose()
始终隐含地调用Close()
。Dispose()
清除ConnectionString,Close()
没有。Close()
而不是Dispose()
如果您选择使用Dispose()
,请不要直接调用它,using
语句是最好的方法。
答案 2 :(得分:2)
答案 3 :(得分:1)
如果任何Class实现了IDisposable接口,则可以使用Dispose方法。
MSDN说:“此接口的主要用途是释放非托管资源。”
由执行者决定这究竟意味着什么。
对于DBConnection,处理也意味着关闭连接...
答案 4 :(得分:1)
请记住,所有Close()都会将连接释放回连接池。您仍会注意到SQL Server中与数据库的活动连接。 如果您还需要确保关闭此功能,您可能需要考虑ClearAllPools或ClearPool
来自MSDN 连接池减少了需要打开新连接的次数。 pooler保持物理连接的所有权。它通过为每个给定的连接配置保持一组活动连接来管理连接。每当用户在连接上调用Open时,pooler会查看池中是否存在可用连接。如果池连接可用,则将其返回给调用者,而不是打开新连接。 当应用程序在连接上调用Close时,pooler会将其返回到池化的活动连接集,而不是实际关闭它。一旦连接返回到池,就可以在下一次打开的呼叫中重复使用。
答案 5 :(得分:0)
关闭和处理做同样的事情。他们为了便于阅读而添加了Close,因为说“关闭连接”更自然。