使用语句和Close方法
当与数据库连接对象一起使用时,using语句是否真的调用close方法? MSDN文档说它确保调用Dispose方法,但没有提到close。 我在Stack Overflow上看到post,人们说它同时做到了。 有人在微软或其他有效的证据中以这种或那种方式得到具体答案吗?
这是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()
如果你使用using
语句连接将被关闭,实现IDisposable的对象在被垃圾收集后仍然保持打开是没有意义的…
但是Close()
和Dispose()
不是一回事:
-
Dispose()
总是隐式调用Close()
。 -
Dispose()
清除ConnectionString,而Close()
则不清除。 - 如果您要再次重新打开连接,则应该
Close()
而不是Dispose()
如果你选择使用Dispose()
不要直接调用它,那么using
语句就是最好的方法。
调用Close
方法将调用Dispose
。 调用哪一个并不重要。
一个具体的例子是FileStream.Close()
方法:
Close的这个实现调用Dispose方法传递一个真值。
如果任何Class实现IDisposable接口,则可以使用Dispose方法。
MSDN说:“此接口的主要用途是释放非托管资源。”
由实现者决定这究竟意味着什么。
在DBConnection的情况下,处理也意味着关闭连接…
请记住,所有Close()都会将连接释放回连接池。 您仍会注意到SQL Server中与数据库的活动连接。 如果您还需要确保关闭它,您可能需要考虑ClearAllPools或ClearPool
从MSDN连接池减少了需要打开新连接的次数。 pooler保持物理连接的所有权。 它通过为每个给定的连接配置保持一组活动连接来管理连接。 每当用户在连接上调用Open时,pooler会查看池中是否存在可用连接。 如果池连接可用,则将其返回给调用者而不是打开新连接。 当应用程序在连接上调用Close时,pooler会将其返回到池化的活动连接集,而不是实际关闭它。 一旦连接返回到池,就可以在下一个Open调用中重用它。
关闭和处理做同样的事情。 他们为了便于阅读而添加了Close,因为你说“关闭连接”更自然。