ホームページ > データベース > mysql チュートリアル > Dapper を使用して接続とトランザクションを効果的に管理するにはどうすればよいですか?

Dapper を使用して接続とトランザクションを効果的に管理するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-19 07:44:10
オリジナル
673 人が閲覧しました

How Should I Manage Connections and Transactions Effectively with Dapper?

Dapper による接続の管理

Dapper では、接続の管理は主に 2 つの方法で処理されます。

接続の完全な管理

このアプローチでは、開発者は明示的に接続を開いたり閉じたりする責任があります。 ADO.NET での接続の処理と同様です。

Dapper による接続の管理を許可する

開発者によってまだ管理されていない場合、Dapper は接続を自動的に開閉できます。これは DataAdapter.Fill() メソッドを使用するのと似ています。

ただし、特により広い粒度 (リクエストごとなど) 内で複数のクエリが含まれるシナリオの場合は、開発者が独自の接続を管理することをお勧めします。

接続処理のベスト プラクティス

リソース リークを回避し、パフォーマンスを向上させるため、使用後は接続を閉じる必要があります。これは、

  • Close()、Dispose() を呼び出すか、接続を using ブロックで囲むことによって実現できます。

リソース管理をさらに強化するには、実装することを検討してください。トランザクションを管理するための作業単位。

作業単位のサンプル コードC#

次の例は、トランザクション管理を処理する UnitOfWork のサンプル実装を示しています。

public sealed class UnitOfWork : IUnitOfWork
{
    internal UnitOfWork(IDbConnection connection)
    {
        _id = Guid.NewGuid();
        _connection = connection;
    }

    IDbConnection _connection = null;
    IDbTransaction _transaction = null;
    Guid _id = Guid.Empty;

    IDbConnection IUnitOfWork.Connection
    {
        get { return _connection; }
    }
    IDbTransaction IUnitOfWork.Transaction
    {
        get { return _transaction; }
    }
    Guid IUnitOfWork.Id
    {
        get { return _id; }
    }

    public void Begin()
    {
        _transaction = _connection.BeginTransaction();
    }

    public void Commit()
    {
        _transaction.Commit();
        Dispose();
    }

    public void Rollback()
    {
        _transaction.Rollback();
        Dispose();
    }

    public void Dispose()
    {
        if(_transaction != null)
            _transaction.Dispose();
        _transaction = null;
    }
}
ログイン後にコピー

Unit of Work を使用したリポジトリ パターン

このコードのリポジトリは、コンストラクターによる依存性注入に依存して UnitOfWork を受け取り、アクセスを制御するための中央の場所を提供します

作業単位を含むリポジトリのサンプル コード

public sealed class MyRepository
{
    public MyRepository(IUnitOfWork unitOfWork) 
    {
        this.unitOfWork = unitOfWork;
    }
    
    IUnitOfWork unitOfWork = null;

    public MyPoco Get()
    {
        return unitOfWork.Connection.Query(sql, param, unitOfWork.Transaction, .......);
    }

    public void Insert(MyPoco poco)
    {
        return unitOfWork.Connection.Execute(sql, param, unitOfWork.Transaction, .........);
    }
}
ログイン後にコピー

作業単位の使用法

UnitOfWork の使用例トランザクション:

using(DalSession dalSession = new DalSession())
{
    UnitOfWork unitOfWork = dalSession.UnitOfWork;
    unitOfWork.Begin();
    try
    {
        //Database code
        MyRepository myRepository = new MyRepository(unitOfWork);
        myRepository.Insert(myPoco);
        unitOfWork.Commit();
    }
    catch
    {
        unitOfWork.Rollback();
        throw;
    }
}
ログイン後にコピー

トランザクションなしの使用例:

using(DalSession dalSession = new DalSession())
{
    //Database code
    MyRepository myRepository = new MyRepository(dalSession.UnitOfWork);
    myRepository.Insert(myPoco);
}
ログイン後にコピー

作業単位で接続とトランザクションを一元的に制御することで、開発者はリソース管理を改善し、適切なデータ整合性を確保できます。

以上がDapper を使用して接続とトランザクションを効果的に管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート