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

Azure sql database 如何为Dapper实现SQLAzure瞬态故障处理框架?,azure-sql-database,dapper,Azure Sql Database,Dapper,我是一个vb.net的家伙,读C#有困难。我将C#Dapper编译成一个DLL,并将其用于我的应用程序。 我主要关心的是,我认为我需要修改源代码,以便在默认情况下在每个SQL查询中集成SQLAzure的瞬态故障处理框架 我可以在连接级别上添加重试逻辑,因为它不是dapper的顶层,而是嵌入在drapper类中的执行查询级别 有人做过吗 *更新* 在Dapper调用上仅使用ReliableSqlConnection是否可以处理执行非查询上的重试逻辑 以下是MS针对transietn故障hanlin

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

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

有人做过吗

*更新*

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

以下是MS针对transietn故障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);

}
这是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();
        }
    }
private static int ExecuteCommand(IDbConnection cnn、IDbTransaction transaction、字符串sql、动作参数读取器、对象obj、int?commandTimeout、CommandType?CommandType)
{
IDbCommand=null;
bool wascolled=cnn.State==ConnectionState.Closed;
尝试
{
cmd=SetupCommand(cnn、事务、sql、paramReader、obj、commandTimeout、commandType);
如果(wasClosed)cnn.Open();
返回cmd.ExecuteNonQuery();
}
最后
{
如果(wascolled)cnn.Close();
如果(cmd!=null)cmd.Dispose();
}
}

我建议将重试包装成Dapper,最好使用RetryPolicy.ExecuteAction方法。这样,两个打开的连接调用 并且将使用TFH重试策略重试命令本身:

例如:

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

我可以确认我当然没有-虽然我个人希望在dapper周围而不是在dapper内部实现瞬态故障处理。是的,但Abround dapper对连接本身是有效的,但逻辑集成也包括ExecuteReaderWithRetry或NonQuery,等等。如果我理解的很好的话,整个执行级的重试必须集成到dapper中。是的,但是你可以编写一个“使用重试”扩展方法…好的,这就是我的C#能力太低而无法做到的地方,通过常规转换器转换到VB.net似乎在这方面不起作用,你知道一个非常有效的C#to VB.net服务吗?我假设VB支持扩展方法。如果是这种情况,您可以在vb中在自己的项目中编写扩展方法。不需要翻译。