Disposeメソッドでデータベース接続を閉じることは正しいですか?
-
06-07-2019 - |
質問
アプリケーションの1つで使用されているデータベース接続が常に閉じているとは限らないという疑いがありました。コードを見に行きましたが、 SqlConnection
オブジェクトを持つクラス DataProvider
を見つけました。接続は、このクラスのコンストラクターで開かれ、その Dispose
メソッドで閉じられます(開いている接続を維持するのは悪いことだと判断しないでください、それは単に私のコードではなく、とにかく質問)。 Dispose
メソッドは次のように実装されます。
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
if (_conn != null)
_conn.Close();
}
_disposed = true;
}
}
質問:
接続が閉じられることを常に保証しますか?
このコードは正しいですか?
_conn.Dispose()
が呼び出されるべきだと思います-私は正しいでしょうか、接続を閉じないことに影響を与える可能性があります(おそらくそうではありません)
解決
Disposeが自動的に呼び出されることはありません。
オブジェクトのDisposeメソッドが明示的に呼び出されるか、クラスがusing()ブロックで使用されるまで、接続は閉じられません
より安全な方法は、ファイナライザでdisposeメソッドを呼び出し、Disposeメソッドが呼び出されたときにファイナライザが抑制されるようにすることです。
この記事は、パターンを実装する正しい方法を示しています
お役に立てばと思います!
Cé dric
他のヒント
conn.Dispose();
も接続を閉じますので、disposeパターンに従うように変更しても害はありません。
ただし、機能的には同等であるため、どこにも問題があるはずです。
http://msdn.microsoft .com / en-us / library / system.data.sqlclient.sqlconnection.close.aspx
SqlConnectionが切れた場合 スコープ、閉じられません。したがって、 明示的に閉じる必要があります Closeを呼び出すことによる接続 廃棄する。閉じると破棄は 機能的に同等。もし 接続プーリング値 trueまたはyesに設定され、基礎となる 接続は 接続プール。一方、 プーリングはfalseまたはnoに設定されます。 サーバーへの基本的な接続は 閉じた。