5

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

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

        _disposed = true;
    }
}

问题是:
它总是保证连接是关闭的吗?
这段代码对吗?

我认为应该_conn.Dispose()调用 - 我是对的,它会影响不关闭连接(可能不会)吗?

4

2 回答 2

8

Dispose 永远不会被自动调用。

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

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

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

希望能帮助到你 !

塞德里克

于 2009-06-19T08:09:53.793 回答
2

conn.Dispose();也将关闭连接,因此更改它以遵循处置模式不会有什么坏处。

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

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx

如果 SqlConnection 超出范围,它不会被关闭。因此,您必须通过调用 Close 或 Dispose 显式关闭连接。Close 和 Dispose 在功能上是等效的。如果连接池值 Pooling 设置为 true 或 yes,则将底层连接返回到连接池。另一方面,如果 Pooling 设置为 false 或 no,则与服务器的底层连接将关闭。

于 2009-06-19T07:57:07.640 回答