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)
| 归档时间: |
|
| 查看次数: |
1513 次 |
| 最近记录: |