错误19 - 物理连接错误

12

从服务器接收结果时发生了传输级错误。(提供程序: 会话提供程序, 错误: 19 - 物理连接不可用) - 这是间歇性的,使用混合连接器从Azure API连接到本地数据库

我尝试从应用服务资源(Web API)连接到本地服务器中的SQL数据库。配置了经典混合连接端点以连接到本地db。

2个回答

18

根本原因:

在 SQL 数据库中,选项卡中有一个名为“自动关闭”的属性,默认设置为 TRUE。

当 Azure 服务(API)连接到 SQL 服务器时,Azure 尝试维护相同的连接池并尝试重用和重新连接它。

由于我们将“自动关闭”设置为 TRUE,SQL 数据库会在一段时间后清除现有连接。而 Azure 尝试重新连接早先已被 SQL 数据库清除的连接。这导致“物理连接不可用 - 错误 19”。

解决方案:

在 SQL 数据库中,转到数据库属性。导航到“OPTIONS”页面并展开自动选项卡,将'AUTO CLOSE'属性设置为'FALSE'

确保您重新启动 Azure 应用程序和数据库服务器,以确保不使用旧连接。

问题已解决。

注意: 这是我遇到的其中之一原因。

另一个有用的方法是使用 Entity Framework 1.1.0 的重试逻辑来消除此错误。

services.AddDbContext<DbContext>(options => options.UseSqlServer('yourconnectionstring',
                 sqlServerOptionsAction: sqlOptions =>
                 {
                     sqlOptions.EnableRetryOnFailure(
                         maxRetryCount: 5,
                         maxRetryDelay: TimeSpan.FromSeconds(30),
                         errorNumbersToAdd: new List<int>() { 19 });
                 }));
在重试逻辑中,不包括错误19。因此,您必须传递错误代码19以设置错误代码19的重试逻辑。

1
似乎您需要为Web API添加重试逻辑,如这里所述。"物理连接不可用"错误可能是由瞬态错误引起的,如此处 Microsoft 文档所述。
"瞬时故障错误通常表现为客户端程序中以下一种错误消息之一:+
•服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并向他们提供会话跟踪 ID •服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并向他们提供会话跟踪 ID (Microsoft SQL Server,错误:40613) •现有连接被远程主机强制关闭。 •System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参见内部异常。---> System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误。 (提供程序:会话提供程序,错误:19-物理连接无法使用) •尝试连接到辅助数据库失败,因为数据库正在重新配置并且正在对主数据库上的活动事务进行新页面应用。"

感谢您的帮助,Alberto,但真正的问题出在 SQL 服务器上。 - Kannan M
我很高兴你找到了罪魁祸首。 - Alberto Morillo
请您看一下我的回答,告诉我您是否能理解。我想表达得更清楚,希望没有人再浪费时间在这个问题上。 - Kannan M
正如我在之前的答案中提到的,重试逻辑是一个可能的解决方案。有时候,在 EF 中尝试捕获 SQL Azure 错误时,您可能会收到错误 0,这是一个通用的错误代码。感谢您抽出时间分享您的解决方案。 - Alberto Morillo
1
谢谢你,Alberto :) 干杯 - Kannan M
1
感谢您将来帮助他人。 - Alberto Morillo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接