gpt4 book ai didi

entity-framework - 为什么 SqlAzureExecutionStrategy 不处理错误 : 19 - Physical connection is not usable

转载 作者:行者123 更新时间:2023-12-03 21:53:35 28 4
gpt4 key购买 nike

完全异常:

System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results from the server. (provider: Session Provider, error: 19 - Physical connection is not usable)

为什么这不是由 SqlAzureExecutionStrategy 处理的?特别是因为这种情况发生在 VIP 交换期间。

编写一个自己的DbExecutionStrategy来处理这个问题是个好主意,还是我遗漏了一些东西?

最佳答案

From the profiler trace we observe that the same connection is used for each query database query. This is by design and as discussed early, i.e. when a connection is explicitly opened by the developer it tells EF not to open/reopen a connection for each command.

这听起来肯定不像是一般性的说法。什么分析器跟踪?为什么假设连接由开发人员显式打开并由 EF 处理?我在原始问题中没有看到类似的内容(这在 EF 中并不常见)。

所以问题仍然没有答案:为什么这不由 SqlAzureExecutionStrategy 处理?编写一个自己的 DbExecutionStrategy 来处理这个问题是个好主意吗?

由于我有时会在我的 Azure 服务中看到此错误,因此我决定对其进行测试。这是我的策略:

public class ExtendedSqlAzureExecutionStrategy : SqlAzureExecutionStrategy
{
public ExtendedSqlAzureExecutionStrategy(int maxRetryCount, TimeSpan maxDelay) : base(maxRetryCount, maxDelay)
{ }

protected override bool ShouldRetryOn(Exception exception)
{
return base.ShouldRetryOn(exception) || IsPhysicalConnectionNotUsableSqlException(exception);
}

private bool IsPhysicalConnectionNotUsableSqlException(Exception ex)
{
var sqlException = ex as SqlException;
if (sqlException != null)
{
// Enumerate through all errors found in the exception.
foreach (SqlError err in sqlException.Errors)
{
if (err.Number == 19)
{
return true;
}
}
}

return false;
}
}

编辑

好的,经过一段时间的记录后,我可以看出该策略基于

if (err.Number == 19)

错误。此错误的实际 SqlException 对象具有 ErrorCode = -2146232060Number = -1 - 我找不到这些文档,因此我决定不将策略基于它们。现在我正在尝试简单的检查:

public class ExtendedSqlAzureExecutionStrategy : SqlAzureExecutionStrategy
{
public ExtendedSqlAzureExecutionStrategy(int maxRetryCount, TimeSpan maxDelay) : base(maxRetryCount, maxDelay)
{ }

protected override bool ShouldRetryOn(Exception exception)
{
return base.ShouldRetryOn(exception) || IsPhysicalConnectionNotUsableSqlException(exception);
}

private bool IsPhysicalConnectionNotUsableSqlException(Exception ex)
{
var sqlException = ex as SqlException;
if (sqlException != null)
{
return sqlException.Message.Contains("Physical connection is not usable");
}

return false;
}
}

编辑2:

它有效。不再有物理连接不可用错误,也没有RetryLimitExceededException,所以这个错误实际上是暂时的(可以通过重试解决),所以我认为它应该包含在 SqlAzureExecutionStrategy 中。

关于entity-framework - 为什么 SqlAzureExecutionStrategy 不处理错误 : 19 - Physical connection is not usable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25998625/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com