错误 19 - 物理连接错误
Error 19 - Physical connection error
从服务器接收结果时发生传输级错误。 (提供程序:会话提供程序,错误:19 - 物理连接不可用)- 间歇性发生,使用混合连接器从 Azure API
连接到本地数据库
我尝试从应用服务资源(Web API)连接到本地服务器中的 SQL 数据库。配置到本地数据库的经典混合连接端点。
您似乎需要向 Web API 添加重试逻辑,如 here. The "Physical connection is not usable" error may be caused by transient errors as explained on this Microsoft 文档所述。
“瞬态错误通常表现为来自您的客户端程序的以下错误消息之一:+
•服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并向他们提供会话跟踪 ID
•服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并向他们提供 的会话跟踪 ID。 (微软 SQL 服务器,错误:40613)
•现有连接被远程主机强行关闭。
•System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: 从服务器接收结果时发生传输级错误。 (提供商:会话提供商,错误:19 - 物理连接不可用)
•连接到辅助数据库的尝试失败,因为该数据库正在进行重新配置,并且它正忙于在主数据库上进行活动事务处理时应用新页面。
根本原因:
在SQL数据库中,Options选项卡中有一个属性 'Auto Close',默认设置为TRUE。
当 Azure 服务 (API) 与 SQL 服务器建立连接时。 Azure 尝试维护相同的连接池并尝试重用并重新连接到它。
正如我们设置的 'Auto Close as TRUE',SQL 数据库会在一段时间后清除现有连接。而 Azure 尝试重新连接先前已被 SQL 数据库清除的连接。这导致 'Physical Connection is not usable - error 19'.
解决方案:
在 SQL db 中,转到数据库属性。导航到 '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的重试逻辑。
从服务器接收结果时发生传输级错误。 (提供程序:会话提供程序,错误:19 - 物理连接不可用)- 间歇性发生,使用混合连接器从 Azure API
连接到本地数据库我尝试从应用服务资源(Web API)连接到本地服务器中的 SQL 数据库。配置到本地数据库的经典混合连接端点。
您似乎需要向 Web API 添加重试逻辑,如 here. The "Physical connection is not usable" error may be caused by transient errors as explained on this Microsoft 文档所述。
“瞬态错误通常表现为来自您的客户端程序的以下错误消息之一:+
•服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并向他们提供会话跟踪 ID
•服务器上的数据库当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并向他们提供 的会话跟踪 ID。 (微软 SQL 服务器,错误:40613)
•现有连接被远程主机强行关闭。
•System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: 从服务器接收结果时发生传输级错误。 (提供商:会话提供商,错误:19 - 物理连接不可用)
•连接到辅助数据库的尝试失败,因为该数据库正在进行重新配置,并且它正忙于在主数据库上进行活动事务处理时应用新页面。
根本原因:
在SQL数据库中,Options选项卡中有一个属性 'Auto Close',默认设置为TRUE。
当 Azure 服务 (API) 与 SQL 服务器建立连接时。 Azure 尝试维护相同的连接池并尝试重用并重新连接到它。
正如我们设置的 'Auto Close as TRUE',SQL 数据库会在一段时间后清除现有连接。而 Azure 尝试重新连接先前已被 SQL 数据库清除的连接。这导致 'Physical Connection is not usable - error 19'.
解决方案:
在 SQL db 中,转到数据库属性。导航到 '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的重试逻辑。