我在 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 服务和资源访问此服务器”选项。
SQL Server 请求在收到此错误之前花费了 14 秒。
默认的 ConnectionTimeout 是 15sec。并且已暂停的无服务器数据库通常需要比取消暂停更长的时间。
如果无服务器数据库暂停,那么第一次登录将恢复 数据库并返回一个错误,说明数据库是 错误代码 40613 不可用。恢复数据库后, 必须重试登录才能建立连接。数据库客户端 不需要修改连接重试逻辑。连接用 SqlClient 驱动程序内置的重试逻辑选项,请参阅 SqlClient 中的可配置重试逻辑。