6

しばらく前に、すべてのデータベース行が のサブクラスで表される .net アプリ用の ORM レイヤーを作成しましたDatabaseRecordLoad()などのメソッドがいくつかありますSave()。私の最初の実装では、DatabaseRecordたとえばのコンストラクターで DB への接続を作成しました。

connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString
);

次に、データベースにアクセスするメソッドの最初と最後で、その SqlConnection に対してOpen()andを呼び出します。Close()これは、(プログラミングには精通しているが、c# と .net には慣れていない) 私には、物事を行うための最も効率的な方法であると思われました。

私はちょうどいくつかの読書をしてきましたが、このパターンは多くの場所で推奨されているようです:

using (var connection = new SqlConnection(...)) {
    connection.Open();
    // Stuff with the connection
    connection.Close();
}

なぜそれが望ましいのかがわかりDispose()ます.途中で行ったことがキャッチされない例外を引き起こしたとしても、接続は自動的に行われます. このように何度も呼び出す可能性があるため、オーバーヘッドがどのようなものか疑問に思っていましたnew SqlConnection()

接続プールがオンになっているため、オーバーヘッドは最小限であり、2 番目のアプローチがベスト プラクティスであると思いますが、私の仮定が正しいことを確認したかっただけです。

4

3 に答える 3

8

はい、ベスト プラクティスです。はusing、Close() への呼び出しを例外セーフにします。

そして、(任意の)オブジェクトを作成するオーバーヘッドは実際には最小であり、存続期間が短いオブジェクト(GCジェネレーション0に留まる)の場合は最小です。

もう using ブロックの最後で Close() を呼び出す必要はありません。これは自動的に行われます (Dispose==Close)。

于 2010-01-07T11:51:47.160 に答える
1

これは部分的に好みの問題です。接続プールを使用している限り、新しい接続を作成する (プールされた接続をリサイクルする) オーバーヘッドは最小限に抑えられるため、一般的に推奨されるパターンは、必要に応じて新しい接続オブジェクトを作成することです。

複数のコマンドを連続して実行する場合、それぞれに新しい接続を作成する理由はないと思いますが、接続を長時間開いたままにしておくことは避けてください。

Disposeまた、メソッドが接続を閉じることに注意してください。Closeしたがって、 と の両方を呼び出す必要はありませんDisposeusing句は終了時に dispose を呼び出すため、通常は呼び出す必要はありませんClose

于 2010-01-07T11:53:42.517 に答える
1

接続の開閉のコストが不明な場合はSqlConnection、クラスのメンバー変数を用意しますが、クラスを作成し、クラスIDisposableが破棄されるときに SqlConnection を破棄します。

于 2010-01-07T11:53:56.727 に答える