【问题标题】:Azure SQL Serverless Database return code when paused暂停时 Azure SQL 无服务器数据库返回代码
【发布时间】:2020-01-30 22:58:30
【问题描述】:

说明:

我有一个连接到 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】:

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

    • HTTP 错误 GatewayTimeout : 网关没有收到响应 在指定时间段内来自‘Microsoft.Sql’
    • HTTP 错误 ServiceUnavailable : 请求超时
    • SQLException:执行超时已过期。在操作完成之前超时时间已过或服务器没有响应。

    您可能还会收到错误 40613,但您也可以捕获一些暂时性错误,如下所示:

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

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

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

    •System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误。 (提供者:Session Provider,错误: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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 2022-10-19
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      相关资源
      最近更新 更多