尝试以正确的方式实现重试逻辑,但找不到有关如何正确利用EnterpriseLibrary.TransientFaultHandling的任何好的示例。 到目前为止,我发现了两个样本:
首先 - 使用ReliableSqlConnection
& conn.Open(retryPolicy)
var retryStrategy = new Incremental(3, TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1));
var retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrategy);
retryPolicy.ExecuteAction(() =>
{
using (var conn = new ReliableSqlConnection(datasetConnectionString))
{
conn.Open(retryPolicy);
using (var command = conn.CreateCommand())
{
command.CommandText = insertToParameters;
command.CommandTimeout = 0;
conn.ExecuteCommand(command);
}
}
});
和第二个 - 没有ReliableSqlConnection:
var retryStrategy = new Incremental(3, TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1));
var retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(retryStrategy);
retryPolicy.ExecuteAction(() =>
{
using (var conn = new SqlConnection(datasetConnectionString))
{
conn.Open();
using (var command = conn.CreateCommand())
{
command.CommandText = insertToParameters;
command.CommandTimeout = 0;
conn.ExecuteCommand(command);
}
}
});
问题很少:
retryPolicy.ExecuteAction
是否真的需要 - 在较旧的示例中,我看到人们只重试个别操作,例如OpenConnectionWithRetries
,ExecuteCommandWithRetries
等,但不是整件事 - 我想知道是否可能在这些重试之间可能会关闭连接。答案 0 :(得分:3)
回答我自己的问题:
使用较新的瞬态错误处理块,使用SqlConnection和提供的扩展方法,例如OpenWithRetry等。
每当API中不支持重试时,请使用retryPolicy.ExecuteAction(()=&gt; {...}),例如SqlBulkCopy,填充数据集表,异步方法等。确保重新打开重试块中的连接。您仍然可以在重试块内使用带有可重试扩展方法的SqlConnection。
更新:编辑以减少混淆
答案 1 :(得分:1)
使用的最佳模式是RetryPolicy.ExecuteAction(()=&gt;。将您的数据库交互包装到ExecuteAction()lambda中并将其视为一个工作单元。这样可以保持与ADO.Net的最高级别的兼容性。 39; s API。它还允许您使用ADO.Net中的新Async方法。
ReliableSQLConnection主要用于向后兼容。