Dapper 용 SQL Azure Transient Fault 처리 프레임 워크를 구현하는 방법은 무엇입니까?

azure-sql-database dapper

문제

나는 vb.net 사람이고 C #을 읽는 데 어려움이 있습니다. C # Dapper를 DLL로 컴파일하고 그것을 내 응용 프로그램에 사용했습니다. 내 주요 관심사는 각 SQL 쿼리에서 SQL Azure 용 일시적 오류 처리 프레임 워크를 기본적으로 통합하도록 원본을 수정해야한다고 생각합니다.

연결 레벨에 재시도 로직을 추가 할 수 있습니다. 연결 레벨은 dapper의 꼭대기에 있기 때문에 가능 합니다만, drapper 클래스에 내장 된 실행 쿼리 레벨에서는 그렇지 않습니다.

누구나 아직 그 짓을 한거야?

* 업데이트 *

Dapper를 호출 할 때 ReliableSqlConnection 만 사용하면 비 실행 쿼리의 재시도 논리가 처리됩니까?

다음은 transientn 오류 처리 기능을 사용하는 MS의 재시도 코드 샘플입니다.

using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling;
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.AzureStorage;
using Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure;
using System.Data;

...

using (ReliableSqlConnection conn = new ReliableSqlConnection(connString, retryPolicy))
{
conn.Open();

IDbCommand selectCommand = conn.CreateCommand();
selectCommand.CommandText = 
  "UPDATE Application SET [DateUpdated] = getdate()";

// Execute the above query using a retry-aware ExecuteCommand method which 
// will automatically retry if the query has failed (or connection was 
// dropped).
int recordsAffected = conn.ExecuteCommand(selectCommand, retryPolicy);

}

다음은 Dapper 코드의 실행 부분입니다. 동일한 이름이 사용되지만 사용자 정의 실행 함수라고 생각합니다.

    private static int ExecuteCommand(IDbConnection cnn, IDbTransaction transaction, string sql, Action<IDbCommand, object> paramReader, object obj, int? commandTimeout, CommandType? commandType)
    {
        IDbCommand cmd = null;
        bool wasClosed = cnn.State == ConnectionState.Closed;
        try
        {
            cmd = SetupCommand(cnn, transaction, sql, paramReader, obj, commandTimeout, commandType);
            if (wasClosed) cnn.Open();
            return cmd.ExecuteNonQuery();
        }
        finally
        {
            if (wasClosed) cnn.Close();
            if (cmd != null) cmd.Dispose();
        }
    }

인기 답변

RetryPolicy.ExecuteAction 메서드를 사용하여 Dapper 주위 에서 다시 시도하는 것이 좋습니다. 이렇게하면 TFH 재시도 정책을 사용하여 연결에 대한 OPEN 호출과 명령 자체가 모두 재 시도됩니다.

예 :

        SqlRetryPolicy.ExecuteAction(() =>
        {
            // Place Dapper ExecuteCommand here: e.g.
            ExecuteCommand(conn,  trans, ... )
        });


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow