1

私は作業単位のクラスに取り組んでおり、接続をどのように処理する必要があるのか​​興味があります。私のリポジトリは作業単位を取り、その接続をGet()コマンドに使用します。

明らかに、Commit()はすべての追加、更新、削除を処理します。これにより、接続が開かれ、トランザクションが開始され、終了すると閉じられます。取得はどのように処理する必要がありますか?

UOWは、コンストラクターで接続を開き、完全に終了したら閉じる必要がありますか?つまり、UOWをリポジトリからリポジトリに渡す間、接続は開いています。それとも、必要な場合にのみ開閉する必要がありますか?

アプローチ#1:作業単位は接続を開き、処理が終了するまで接続は開いたままになりますか?

public UnitOfWork(IDbConnection connection)
{
    Connection = connection;
    Connection.Open();
    Transaction = Connection.BeginTransaction();
}

アプローチ#2:読み取りの直前に開き、直後に閉じるGetメソッドのスニペット。複数のリポジトリに渡す場合は、同じ接続が使用され、束を開いたり閉じたりするだけです。

 using (var reader = manager.GetReader())
 {
     UOW.Connection.Open();

     while (reader.Read())
         list.Add(factory.CreateTFromReader(reader));

     UOW.Connection.Close();
 }
4

1 に答える 1

8

いいえ、必要に応じて常に接続を開き、作業が完了したら必ず接続を閉じる必要があります。接続プールメカニズムは、現在のユーザーまたは同じサーバーで同時に接続している他のユーザーが接続を利用できるようにします。

また、2番目の例は正しくないと思います。あなたはこのようなものを持っている必要があります

 using (IDbConnection cn = manager.GetConnection)
 using (var reader = manager.GetReader())
 {
     cn.Open();

     while (reader.Read())
         list.Add(factory.CreateTFromReader(reader));
 }

これにより、例外が発生した場合でも接続が閉じられ、再利用するためにプールに戻されます。

接続プール

于 2012-12-17T16:50:56.327 に答える