Azure SQL Serverless Database暂停时返回代码

问题描述 投票:0回答:1

描述:

我有一个连接到Azure无服务器数据库的应用程序。数据库可以处于暂停状态和联机状态。如果一小时内没有任何活动,数据库将自动暂停。这意味着当我的应用程序在暂停时尝试打开与数据库的连接时,该连接将超时并给出超时异常。

Azure在其文档中指出:

如果无服务器数据库被暂停,则第一次登录将恢复数据库并返回错误,指出该数据库不可用,错误代码40613。恢复数据库后,必须重试该登录以建立连接。具有连接重试逻辑的数据库客户端不需要修改。 source

当我尝试通过SQL Management Studio连接到数据库时,我能够获得此错误代码40613。但是,当我尝试从应用程序打开与数据库的连接时,只会收到超时异常,因此我不知道该数据库是否不可用或该数据库是否实际上正在恢复。

代码示例:

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();
        }
    }

例外示例:

当我运行我的应用程序并且数据库处于暂停状态时,出现此异常:Snippet of exception in Visual Studio

有人知道为什么我没有得到Azure在其文档中指出的错误代码40613吗?

azure-sql-database
1个回答
0
投票

实际上,当Azure数据库不可用时,您可能会收到超时错误。实际上,您可能会遇到以下错误:

  • HTTP错误GatewayTimeout:网关未收到响应在指定时间段内从“ Microsoft.Sql”开始
  • HTTP错误ServiceUnavailable:请求超时
  • SQLException:执行超时已过期。在操作完成之前超时时间已过,或者服务器没有响应。
  • 您也可能会收到错误40613,但您可以捕获一些短暂的错误,如下所示:

•服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请与客户支持联系,并向他们提供会话跟踪ID [

•服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并为他们提供会话跟踪ID。 (Microsoft SQL Server,错误:40613)

•现有连接被远程主机强行关闭。

•System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参见内部异常。 ---> System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误。 (提供者:会话提供者,错误:19-物理连接不可用)

•与辅助数据库的连接尝试失败,因为该数据库正在重新配置,并且在主数据库上进行活动转换时正忙于应用新页面。

由于这些错误,并在here中有更详细的说明,因此必须在连接到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.
    }
}

有关如何创建重试逻辑here的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.