Я использую .Net 4.8 и EF6.5 с Microsoft.Data.SqlClient. Я хочу управлять повторными попытками для моего приложения SQL Azure WinForms.
У меня есть класс, производный от MicrosoftSqlAzureExecutionStrategy, для регистрации повторных попыток и добавления дополнительного кода ошибки в целях тестирования. Когда я проверяю свои журналы, там в 3 раза больше записей, чем я ожидал. Когда я удаляю вызов GetNextDelay(..), я даже получаю больше записей в журнале. Как правильно настроить производный класс от MicrosoftSqlAzureExecutionStrategy? Почему количество повторов меняется (я использовал значение по умолчанию, которое должно быть 5)?
Вот мой код:
Я использую .Net 4.8 и EF6.5 с Microsoft.Data.SqlClient. Я хочу управлять повторными попытками для моего приложения SQL Azure WinForms. У меня есть класс, производный от MicrosoftSqlAzureExecutionStrategy, для регистрации повторных попыток и добавления дополнительного кода ошибки в целях тестирования. Когда я проверяю свои журналы, там в 3 раза больше записей, чем я ожидал. Когда я удаляю вызов GetNextDelay(..), я даже получаю больше записей в журнале. Как правильно настроить производный класс от MicrosoftSqlAzureExecutionStrategy? Почему количество повторов меняется (я использовал значение по умолчанию, которое должно быть 5)? Вот мой код: [code]public class MyStrategy : MicrosoftSqlAzureExecutionStrategy { public static List _exceptionsEncountered = new List();
public MyStrategy(bool reset) { if (reset) { _exceptionsEncountered.Clear(); } }
protected override bool ShouldRetryOn(Exception exception) { _exceptionsEncountered.Add(exception); var currentRetryCount = _exceptionsEncountered.Count - 1; var delay = GetNextDelay(exception); if (delay == null) { delay = new TimeSpan(0); } int errorCode = -1; if (exception is Microsoft.Data.SqlClient.SqlException) { errorCode = (exception as Microsoft.Data.SqlClient.SqlException).Number; } ErrorMessage($"ShouldRetryOn: retry Count: {currentRetryCount}, delay: {delay}, exception no.: {errorCode}, exception: {exception.Message}");
// only for testing: if (errorCode == 11001) { return true; }
return base.ShouldRetryOn(exception); } }
public class DataContextConfiguration : MicrosoftSqlDbConfiguration { public DataContextConfiguration() { SetProviderFactory(MicrosoftSqlProviderServices.ProviderInvariantName, SqlClientFactory.Instance); SetProviderServices(MicrosoftSqlProviderServices.ProviderInvariantName, MicrosoftSqlProviderServices.Instance); /*** set execution/retry strategy of connections** */ SetExecutionStrategy(MicrosoftSqlProviderServices.ProviderInvariantName, () => new MyStrategy(true)); } }
[DbConfigurationType(typeof(DataContextConfiguration))] public partial class TestModel : DbContext { public TestModel(string connectionString) : base(connectionString) { Database.Log = sql => Debug.Write(sql); //avoid internal errors like Invalid object name 'dbo.__MigrationHistory'. Database.SetInitializer(null); } ... }