如何为Dapper实现SQL Azure瞬态故障处理框架?

Jér*_*ere 6 dapper azure-sql-database

我是一个vb.net的家伙,很难阅读C#.我将C#Dapper编译为DLL并将其用于我的应用程序.我主要担心的是我认为我需要修改源代码,以便在每个SQL查询中默认集成SQL Azure的瞬态故障处理框架.

我可以在连接级别添加重试逻辑,因为它位于dapper的顶部,但不是在drapper类中嵌入的执行查询级别.

有人做过吗?

*更新*

在Dapper调用之上仅使用ReliableSqlConnection是否会处理执行非查询的重试逻辑?

以下是MS使用transietn fault hanling重试的示例代码

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

}
Run Code Online (Sandbox Code Playgroud)

这是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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 3

我建议将重试包装在 Dapper周围,最好使用 RetryPolicy.ExecuteAction 方法。这样,对连接的 OPEN 调用和命令本身都将使用 TFH 重试策略重试:

例如:

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