Я использую SqlRetryLogicBaseProvider для определения своих повторных попыток для приложения Win Forms SQL Azure .Net Framework 4.8. Я только начинаю понимать основные механизмы, выполняя простые тесты на отключение. У меня также есть клиенты с очень нестабильным Интернетом, поэтому потеря подключения к Интернету при выполнении команды может стать проблемой. Поэтому я добавил код ошибки 11001 в список временных ошибок. Однако я просто не понимаю, как правильно настроить логику повтора. Если Интернет пропадает при открытии соединения, все «в порядке», Connection.open повторяется. Но если подключение к Интернету потеряно при выполнении команды.ExecuteReader(), после первой повторной попытки команды выдается ошибка, и повторной попытки соединения не происходит.
Исключение: ExecuteReader требует открытия и доступное соединение. Текущее состояние соединения — «закрыто».
Где мне нужно обрабатывать состояние соединения? В событии повторной попытки SqlRetryLogicBaseProvider? Будет ли он повторен, если он будет обработан там?
Вот мой код:
var options = new SqlRetryLogicOption()
{
// Tries 5 times before throwing an exception
NumberOfTries = 5,
// Preferred gap time to delay before retry
DeltaTime = TimeSpan.FromSeconds(5),
// Maximum gap time for each delay time before retry
MaxTimeInterval = TimeSpan.FromSeconds(60),
TransientErrors = new List { -1, -2, 0, 109, -2146232060, 596, 1204, 1205, 1222, 49918, 49919, 49920, 4060, 4221, 40143, 40613, 40501, 40540, 40197, 10929, 10928, 10060, 10054, 10053, 997, 233, 64, 18401, 11001 ,1232}
};
// Create a retry logic provider
SqlRetryLogicBaseProvider provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
provider.Retrying += (object s, SqlRetryingEventArgs e) =>
{
LogRetry(e);
// handle connection loss here? if so, how?
}
try
{
using (var connection = new SqlConnection(ConnectionString))
{
//retry provider for connection:
connection.RetryLogicProvider = provider;
// SqlParameter parameter;
const string selectCmd = "SELECT data FROM mydata WHERE dataID = @dataID";
using (var command = new SqlCommand(selectCmd, connection))
{
SqlParameter parameter = new SqlParameter("@dataID", SqlDbType.NVarChar, 9);
parameter.Value = did;
command.Parameters.Add(parameter);
// set retry provider for command:
command.RetryLogicProvider = provider;
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("{0}", reader.GetString(0));
}
}
}
}
catch (Exception ex)
{
return String.Empty;
}
РЕДАКТИРОВАТЬ 1:
Я изменил событие повторной попытки. RetryLogicProvider по-прежнему является частью соединения. Проблема теперь в том, что внутренний счетчик повторов теряется и всегда настроен на повтор номер 1, так что мое соединение повторяется в бесконечном цикле. Пока не удалось выяснить, как это увеличить.
provider.Retrying += (object s, SqlRetryingEventArgs e) =>
{
LogRetry(e);
if (s is SqlConnection)
{
var conn = s as SqlConnection;
conn.Close();
conn.Open();
}
else
{
if (s is SqlCommand)
{
var cmd = s as SqlCommand;
cmd.Connection.Close();
cmd.Connection.Open();
}
}
};
Подробнее здесь: https://stackoverflow.com/questions/790 ... ng-command
Как использовать RetryLogicProvider для потери соединения во время команды ⇐ C#
Место общения программистов C#
1727175628
Anonymous
Я использую SqlRetryLogicBaseProvider для определения своих повторных попыток для приложения Win Forms SQL Azure .Net Framework 4.8. Я только начинаю понимать основные механизмы, выполняя простые тесты на отключение. У меня также есть клиенты с очень нестабильным Интернетом, поэтому потеря подключения к Интернету при выполнении команды может стать проблемой. Поэтому я добавил код ошибки 11001 в список временных ошибок. Однако я просто не понимаю, как правильно настроить логику повтора. Если Интернет пропадает при открытии соединения, все «в порядке», Connection.open повторяется. Но если подключение к Интернету потеряно при выполнении команды.ExecuteReader(), после первой повторной попытки команды выдается ошибка, и повторной попытки соединения не происходит.
Исключение: ExecuteReader требует открытия и доступное соединение. Текущее состояние соединения — «закрыто».
Где мне нужно обрабатывать состояние соединения? В событии повторной попытки SqlRetryLogicBaseProvider? Будет ли он повторен, если он будет обработан там?
Вот мой код:
var options = new SqlRetryLogicOption()
{
// Tries 5 times before throwing an exception
NumberOfTries = 5,
// Preferred gap time to delay before retry
DeltaTime = TimeSpan.FromSeconds(5),
// Maximum gap time for each delay time before retry
MaxTimeInterval = TimeSpan.FromSeconds(60),
TransientErrors = new List { -1, -2, 0, 109, -2146232060, 596, 1204, 1205, 1222, 49918, 49919, 49920, 4060, 4221, 40143, 40613, 40501, 40540, 40197, 10929, 10928, 10060, 10054, 10053, 997, 233, 64, 18401, 11001 ,1232}
};
// Create a retry logic provider
SqlRetryLogicBaseProvider provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
provider.Retrying += (object s, SqlRetryingEventArgs e) =>
{
LogRetry(e);
// handle connection loss here? if so, how?
}
try
{
using (var connection = new SqlConnection(ConnectionString))
{
//retry provider for connection:
connection.RetryLogicProvider = provider;
// SqlParameter parameter;
const string selectCmd = "SELECT data FROM mydata WHERE dataID = @dataID";
using (var command = new SqlCommand(selectCmd, connection))
{
SqlParameter parameter = new SqlParameter("@dataID", SqlDbType.NVarChar, 9);
parameter.Value = did;
command.Parameters.Add(parameter);
// set retry provider for command:
command.RetryLogicProvider = provider;
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("{0}", reader.GetString(0));
}
}
}
}
catch (Exception ex)
{
return String.Empty;
}
[b]РЕДАКТИРОВАТЬ 1:[/b]
Я изменил событие повторной попытки. RetryLogicProvider по-прежнему является частью соединения. Проблема теперь в том, что внутренний счетчик повторов теряется и всегда настроен на повтор номер 1, так что мое соединение повторяется в бесконечном цикле. Пока не удалось выяснить, как это увеличить.
provider.Retrying += (object s, SqlRetryingEventArgs e) =>
{
LogRetry(e);
if (s is SqlConnection)
{
var conn = s as SqlConnection;
conn.Close();
conn.Open();
}
else
{
if (s is SqlCommand)
{
var cmd = s as SqlCommand;
cmd.Connection.Close();
cmd.Connection.Open();
}
}
};
Подробнее здесь: [url]https://stackoverflow.com/questions/79017944/how-to-use-retrylogicprovider-for-connection-lost-during-command[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия