C# 在Dispose方法中关闭数据库连接是否正确?

C# 在Dispose方法中关闭数据库连接是否正确?,c#,.net,database-connection,dispose,C#,.net,Database Connection,Dispose,我怀疑在我们的一个应用程序中使用的数据库连接并不总是关闭的。我去看了代码,发现了一个类DataProvider,它有SqlConnection对象。这个连接在这个类的构造函数中打开,在它的Dispose方法中关闭(不要判断,我知道保持一个打开的连接是邪恶的,这不是我的代码,也不是问题的重点)。Dispose方法的实现方式如下: protected virtual void Dispose(bool disposing) { if (!_disposed) { if

我怀疑在我们的一个应用程序中使用的数据库连接并不总是关闭的。我去看了代码,发现了一个类
DataProvider
,它有
SqlConnection
对象。这个连接在这个类的构造函数中打开,在它的
Dispose
方法中关闭(不要判断,我知道保持一个打开的连接是邪恶的,这不是我的代码,也不是问题的重点)。
Dispose
方法的实现方式如下:

protected virtual void Dispose(bool disposing)
{
    if (!_disposed)
    {
        if (disposing)
        {
            if (_conn != null)
                _conn.Close();
        }

        _disposed = true;
    }
}
问题是:
它是否始终保证连接已关闭?
这个代码对吗

我认为应该调用
\u conn.Dispose()
也将关闭连接,因此更改它以遵循dispose模式不会有什么坏处

但在功能上是等价的,所以在其他地方肯定有问题

如果SqlConnection失效 范围,它不会被关闭。所以,, 必须显式关闭 通过调用Close或 处置关闭并处理 功能等效的。如果 连接池值池不可用 如果设置为true或yes,则基础 连接返回到 连接池。另一方面,如果 如果池设置为false或no,则 与服务器的基础连接是 关闭


Dispose从不自动调用

在显式调用对象的Dispose方法之前,或者在using()块中使用类之前,连接不会关闭

更安全的方法是在终结器中调用dispose方法,并确保在调用dispose方法时抑制终结器

介绍实现该模式的正确方法

希望有帮助


Cédric

如果您有怀疑,请使用性能计数器进行检查确认。要检查的键值是NumberOfPooledConnections。确定,但如果应用程序关闭(正常或由于错误),将调用dispose方法并关闭连接?当应用程序关闭时,垃圾回收器应该调用所有终结器,这样至少会关闭连接,因为连接对象的终结器将被触发。。。但这是一种断绝联系的蹩脚方式;o) 顺便说一下:Dispose方法永远不会自动调用。在您当前的代码状态下,连接被关闭,因为Connection的dispose方法是在其终结器中调用的。您的意思是无论如何都不会调用此方法吗?如果未在代码中显式调用、未由finilizer调用或最终由祖先的调用,也未在using()块末尾调用,永远不会调用此方法