3

システム内の複数のリポジトリから情報を入力する必要があるという見方があります。

var employee = employeeRepository.GetEmployeeById(20);
var notes = notesRepository.GetNotes();

データアクセスにADO.NETを使用しています。各リポジトリは、パラメータとして接続を取り込む必要がありますか?

using(var connection = dbFactory.GetConnection())
{    
    var employeeRepository = new EmployeeRepository(connection);
    var notesRepository = new NotesRepository(connection);
}

または、各Getメソッドは、メソッド内の接続を開いたり閉じたりする必要がありますか?実行の時間を計りましたが、渡された単一の接続を使用する方が高速です。トンではありません。私は今、正しいアプローチをとることにもっと関心があります。

また、接続を開いたり閉じたりし続けることは、データベースにどのような影響を及ぼしますか?

4

1 に答える 1

1

ADO.NETはを使用しconnection poolingてパフォーマンスを向上させます(これはSQLサーバーに当てはまります。接続プールをサポートしているかどうかは、データベースプロバイダーのドキュメントで確認してください)。したがって、新しいSqlConnectionを作成するときは、実際にはデータベースへの物理接続を開いていません。接続プールから既存の接続を描画しているだけです。また、既存の接続で.Disposeを呼び出す場合、実際にはデータベースへの物理接続を閉じていません。この接続を接続プールに戻すだけで、再利用できます。

したがって、データベースにクエリを送信するたびに、次のコードを安全に記述できます。

using (var conn = new SqlConnection(ConnectionString))
using (var cmd = conn.CreateCOmmand())
{
    // no, you are not opening a real connection here, you are just drawing one from the pool
    conn.Open();
    cmd.CommandText = "SELECT ....";
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // ...
        }
    }
} // No, you are not closing the connection here, you are simply returning it to the pool

したがって、基本的に、ADO.NETプロバイダーが接続プールをサポートしている場合(通常、すべての尊敬されるプロバイダーがサポートする必要があります)、SQL接続への参照を格納する必要はありません。コンストラクターを呼び出して、接続文字列を渡すだけです。結果として、接続文字列が必要なすべてです。

備考:接続プールは、AppDomainごとおよび接続文字列ごとに実行されます。これは、同じデータベースに接続する2つの異なる接続文字列があり、それらの2つの接続文字列をSQL接続の異なるインスタンスに渡す場合、接続文字列ごとに接続プール(つまり、2つのプール)を取得することを意味します。

于 2012-12-13T21:59:14.937 に答える