Azure SQL Код возврата базы данных без сервера при остановке - PullRequest
3 голосов
/ 30 января 2020

Описание:

У меня есть приложение, которое подключается к Azure Бессерверной базе данных. База данных может находиться в состоянии паузы и в режиме онлайн. База данных автоматически приостанавливается, если в течение часа не было никаких действий. Это означает, что, когда мое приложение пытается открыть соединение с базой данных, когда оно приостановлено, соединение прерывается и выдает исключение тайм-аута.

Azure заявляет в своей документации, что:

Если база данных без сервера приостановлена, то первый вход в систему возобновит работу базы данных и вернет ошибку, сообщающую, что база данных недоступна с кодом ошибки 40613. После возобновления работы базы данных необходимо повторить попытку входа, чтобы установить sh подключение , Клиенты базы данных с логикой повторных попыток подключения c изменять не нужно. source

Я могу получить этот код ошибки 40613, когда я пытаюсь подключиться к базе данных через SQL Management Studio. Но когда я пытаюсь открыть соединение с базой данных из своего приложения, я получаю только исключение тайм-аута, поэтому я не знаю, недоступна ли база данных или она действительно возобновляется.

Пример кода:

public IDbConnection GetConnection()
    {
        var connection = new SqlConnection(_connectionString);
        try
        {
            connection.Open();
            return connection;
        }
        catch (SqlException e)
        {
            if (e.Number == 40613)
            {
                //Database is resuming
            }
        }
        finally
        {
            connection.Close();
        }
    }

Пример исключения:

Когда я запускаю свое приложение и база данных находится в состоянии паузы, я получаю это исключение: Фрагмент исключения в Visual Studio

Кто-нибудь знает, почему я не получаю код ошибки 40613, который Azure указывает в их документации?

1 Ответ

0 голосов
/ 30 января 2020

Действительно, вы можете получить ошибки тайм-аута, когда база данных Azure недоступна. Фактически вы можете получить следующие ошибки:

  • Ошибка HTTP GatewayTimeout: шлюз не получил ответ от 'Microsoft.Sql' в течение указанного периода времени
  • Ошибка HTTP ServiceUnavailable: Тайм-аут запроса
  • SQLException: время ожидания истекло. Время ожидания истекло до завершения операции, или сервер не отвечает.

Вы также можете получить ошибку 40613, но вы можете зафиксировать некоторые временные ошибки, как показано ниже:

• База данных на сервере в данный момент недоступна. Пожалуйста, повторите попытку позже. Если проблема не устраняется, обратитесь в службу поддержки клиентов и предоставьте им идентификатор трассировки сеанса

• База данных на сервере в данный момент недоступна. Пожалуйста, повторите попытку позже. Если проблема не устранена, обратитесь в службу поддержки и предоставьте им идентификатор трассировки сеанса. (Microsoft SQL Server, ошибка: 40613)

• Существующее соединение было принудительно закрыто удаленным хостом.

• System.Data.Entity.Core.EntityCommandExecutionException: ошибка произошла во время выполнение определения команды. Смотрите внутреннее исключение для деталей. ---> System.Data.SqlClient.SqlException: при получении результатов с сервера произошла ошибка транспортного уровня. (поставщик: поставщик сеанса, ошибка: 19 - физическое соединение не используется)

• Попытка подключения к вторичной базе данных не удалась, поскольку база данных находится в процессе реконфигурации, и она занята применением новых страниц в то время как в середина активного перехода в первичной базе данных.

Из-за этих ошибок и более подробного объяснения здесь необходимо создать логи повторной попытки c для приложений, которые подключаются к Azure SQL База данных.

public void HandleTransients()
{
    var connStr = "some database";
    var _policy = RetryPolicy.Create < SqlAzureTransientErrorDetectionStrategy(
        retryCount: 3,
        retryInterval: TimeSpan.FromSeconds(5));

    using (var conn = new ReliableSqlConnection(connStr, _policy))
    {
        // Do SQL stuff here.
    }
}

Подробнее о том, как создать повторные логи c здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...