В течение последнего дня или около того я пытался внедрить обработку временных сбоев в базе данных Azure SQL. Хотя у меня есть работающее соединение с БД, я не уверен, что оно обрабатывает временные ошибки должным образом.
До сих пор мой подход включал
public static void SetRetryStratPol()
{
const string defaultRetryStrategyName = "default";
var strategy = new Incremental(defaultRetryStrategyName, 3, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
var strategies = new List<RetryStrategy> { strategy };
var manager = new RetryManager(strategies, defaultRetryStrategyName);
RetryManager.SetDefault(manager);
retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(strategy);
retryPolicy.Retrying += (obj, eventArgs) =>
{
var msg = String.Format("Retrying, CurrentRetryCount = {0} , Delay = {1}, Exception = {2}", eventArgs.CurrentRetryCount, eventArgs.Delay, eventArgs.LastException.Message);
System.Diagnostics.Debug.WriteLine(msg);
};
}
Я вызываю этот метод из Global.asax
, Application_Start()
. [retryPolicy
— это глобальная статическая переменная в статическом классе, который также включает следующий метод.]
Затем у меня есть метод
public static ReliableSqlConnection GetReliableConnection()
{
var conn = new ReliableSqlConnection("Server=...,1433;Database=...;User ID=...;Password=...;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;", retryPolicy);
conn.Open();
return conn;
}
Затем я использую этот метод
using (var conn = GetReliableConnection())
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT COUNT(*) FROM ReliabilityTest";
result = (int) cmd.ExecuteScalarWithRetry();
return View(result);
}
Пока это работает. Затем, чтобы проверить политику повторных попыток, я попытался использовать неправильное имя пользователя (предложение от здесь).
Но когда я прохожу этот код, курсор сразу же переходит к моей инструкции catch
с
Ошибка входа для пользователя «[мое имя пользователя]».
Я ожидал, что это исключение будет перехвачено только через несколько секунд, но никакой задержки не возникает.
Кроме того, я также пытался использовать Entity Framework, точно следуя это сообщение, но получите тот же результат.
Что я пропустил? Есть ли этап настройки или я неправильно вызываю временную ошибку?