登录后阶段超时时间已过

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

我在 Azure 中有一个应用服务,连接到 Azure 中的 SQL Server 数据库。应用服务有多个与数据库交互的定时器触发的 WebJobs。

每次执行 SQL 请求时我都会收到以下异常,并且现有的建议都没有帮助我:

Microsoft.Data.SqlClient.SqlException (0x80131904): 连接超时已过期。在登录后阶段超时期限已过。连接可能在等待服务器完成登录过程和响应时超时;或者它可能在尝试创建多个活动连接时超时。尝试连接到此服务器所花费的持续时间是 - [Pre-Login] initialization=124;握手=49; 【登录】初始化=0;认证=0; [登录后] complete=14011;

App Service 层是 S1,它启用了 Always On。 SQL 层是“通用 - 无服务器:标准系列(Gen5),1 个 vCore”。

无论数据如何,每次都会出现错误。昨天它发生在 5 条记录的数据大小上。根据 App Insights,SQL Server 请求在收到此错误之前花费了 14 秒。

当我使用相同的 Azure 数据库在我的 PC 上本地运行应用程序时,该错误从未发生。这样它就毫不费力地处理了数万条记录,所以我认为这不是数据库配置问题。

我最好的猜测是我的应用程序中的连接生命周期管理存在某种问题,因为它在立即执行 WebJob 时在本地运行,但在启动半天后在 Azure 上崩溃。我使用 EF Core,我这样注册了应用上下文:

collection
        .AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                context.Configuration.GetConnectionString("Database"),
                sqlServerOptions =>
                {
                    sqlServerOptions.CommandTimeout(3600);
                    sqlServerOptions.EnableRetryOnFailure(5, TimeSpan.FromSeconds(30), null);
                }))

...并且所有使用数据库上下文的服务都注册为“作用域”。

也可能是 SQL Server 防火墙问题,但它确实启用了“允许 Azure 服务和资源访问此服务器”选项。

c# sql-server azure entity-framework asp.net-core
1个回答
0
投票

SQL Server 请求在收到此错误之前花费了 14 秒。

默认的 ConnectionTimeout 是 15sec。并且已暂停的无服务器数据库通常需要比取消暂停更长的时间。

如果无服务器数据库暂停,那么第一次登录将恢复 数据库并返回一个错误,说明数据库是 错误代码 40613 不可用。恢复数据库后, 必须重试登录才能建立连接。数据库客户端 不需要修改连接重试逻辑。连接用 SqlClient 驱动程序内置的重试逻辑选项,请参阅 SqlClient 中的可配置重试逻辑。

无服务器计算层 - 连接性

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