Heim >Datenbank >MySQL-Tutorial >Wie kann ich Verbindungen und Transaktionen mit Dapper effektiv verwalten?

Wie kann ich Verbindungen und Transaktionen mit Dapper effektiv verwalten?

Barbara Streisand
Barbara StreisandOriginal
2024-12-19 07:44:10675Durchsuche

How Should I Manage Connections and Transactions Effectively with Dapper?

Verbindungen mit Dapper verwalten

In Dapper erfolgt die Verwaltung von Verbindungen hauptsächlich auf zwei Arten:

Vollständige Verwaltung von Verbindungen

Bei diesem Ansatz ist der Entwickler dafür verantwortlich, die Verbindung explizit zu öffnen und zu schließen. Ähnlich wie bei der Handhabung von Verbindungen in ADO.NET.

Dapper die Verwaltung von Verbindungen erlauben

Dapper kann Verbindungen automatisch öffnen und schließen, wenn sie nicht bereits vom Entwickler verwaltet werden. Dies ähnelt der Verwendung der DataAdapter.Fill()-Methode.

Es wird jedoch empfohlen, dass Entwickler ihre eigenen Verbindungen verwalten, insbesondere für Szenarien mit mehreren Abfragen innerhalb einer größeren Granularität (z. B. pro Anfrage).

Best Practices für den Umgang mit Verbindungen

Um Ressourcenlecks zu vermeiden und die Leistung zu verbessern, sollten Verbindungen nach der Verwendung geschlossen werden. Dies kann erreicht werden durch:

  • Aufrufen von Close(), Dispose() oder Einschließen der Verbindung in einen using-Block.

Um die Ressourcenverwaltung weiter zu verbessern, sollten Sie die Implementierung in Betracht ziehen eine Arbeitseinheit zum Verwalten von Transaktionen.

Beispielcode für eine Arbeitseinheit in C#

Das folgende Beispiel stellt eine Beispielimplementierung einer UnitOfWork bereit, die die Transaktionsverwaltung übernimmt:

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;
    }
}

Repository-Muster mit Unit of Work

Repositorys in diesem Code basieren auf der Abhängigkeitsinjektion mit dem Konstruktor, um UnitOfWork zu empfangen, und bieten so einen zentralen Ort für die Steuerung des Zugriffs auf Datenbank.

Beispielcode für Repository mit Arbeitseinheit

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, .........);
    }
}

Verwendung der Arbeitseinheit

Beispielverwendung der UnitOfWork mit einer Transaktion:

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;
    }
}

Beispielverwendung von ohne a Transaktion:

using(DalSession dalSession = new DalSession())
{
    //Database code
    MyRepository myRepository = new MyRepository(dalSession.UnitOfWork);
    myRepository.Insert(myPoco);
}

Durch die zentrale Steuerung von Verbindungen und Transaktionen mit einer Arbeitseinheit können Entwickler das Ressourcenmanagement verbessern und eine ordnungsgemäße Datenintegrität sicherstellen.

Das obige ist der detaillierte Inhalt vonWie kann ich Verbindungen und Transaktionen mit Dapper effektiv verwalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn