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