5

私たちのアプリケーションの 1 つで使用されているデータベース接続が常に閉じられているとは限らないのではないかと疑っています。コードを見に行ったところ、オブジェクトDataProviderを持つクラスが見つかりました。SqlConnection接続はこのクラスのコンストラクターで開かれ、その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 に答える