> 데이터 베이스 > MySQL 튜토리얼 > Dapper를 사용하여 연결 및 트랜잭션을 어떻게 효과적으로 관리해야 합니까?

Dapper를 사용하여 연결 및 트랜잭션을 어떻게 효과적으로 관리해야 합니까?

Barbara Streisand
풀어 주다: 2024-12-19 07:44:10
원래의
581명이 탐색했습니다.

How Should I Manage Connections and Transactions Effectively with Dapper?

Dapper로 연결 관리

Dapper에서 연결 관리는 두 가지 기본 방법으로 처리됩니다.

연결 전체 관리

이 접근 방식에서는 개발자가 명시적으로 연결을 열고 닫을 책임이 있습니다. 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;
    }
}
로그인 후 복사

작업 단위가 있는 저장소 패턴

이 코드의 저장소는 생성자를 통한 종속성 주입을 통해 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿