尝试以正确的方式实现重试逻辑,但无法找到任何关于如何正确利用EnterpriseLibrary.TransientFaultHandling的好示例。目前我找到了两个示例:
第一个 - 使用ReliableSqlConnection和conn.Open(retryPolicy)
第一个 - 使用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
等,但不是整个过程 - 我想知道这样做是否可能导致连接在这些重试之间被关闭。