gpt4 book ai didi

c# - SQLAzureExecutionStrategy ShouldRetryOn 未在 EF 异常上调用

转载 作者:行者123 更新时间:2023-11-30 23:29:34 25 4
gpt4 key购买 nike

我正在尝试合并 SQLAzureConnectionStrategy,因为我有一个 Azure Web 应用程序,在某些情况下会通过混合连接调用本地 SQL 数据库。连接有点不稳定,有时读取数据会出现异常,但立即重试就可以了。

我认为这对于 SQLAzureConnectionStrategy 来说是一个很好的案例,因为您可以将其配置为重试。

我已经设置了我的 DbConfiguration 类:

  public class dbUnitsConfiguration : DbConfiguration
{
public dbUnitsConfiguration()
{
SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
? (IDbExecutionStrategy)new DefaultExecutionStrategy()
: new CustomExecutionStrategy(6, new TimeSpan(0, 0, 4)));

AddInterceptor(new dbUnitsInterceptor());
}

public static bool SuspendExecutionStrategy
{
get { return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false; }
set { CallContext.LogicalSetData("SuspendExecutionStrategy", value); }
}

}

SuspendExcutionStrategy 位可能不是必需的,但我变得绝望并尝试了我见过的不同东西。

这是我从 SQLAzureExecutionStrategy 派生的类,因此我可以重写 ShouldRetryOn

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


protected override bool ShouldRetryOn(Exception exception)
{
Log.LogInformation("Retrying on " + exception.Message);
return true;
}


}

我按照文章 http://thedatafarm.com/data-access/testing-out-the-connection-resiliency-feature-into-ef6/ 中的示例进行操作为了测试我是否通过模拟 Interceptor 类中的异常来正确实现它,这一切都工作得很好。我什至可以在调试中捕获它并看到 ShouldRetryOn 被调用。

但是,如果我在实际的 Entity Framework 调用中遇到异常,它只会作为异常返回,并且 ShouldRetryOn 会被绕过。

我什至将模拟异常直接放入 Entity Framework 调用中,如下所示:

   public IEnumerable<Shared.Models.Client> GetAll()
{
// throw SqlExceptionFaker.Error10053;
return Mapper.Map<List<Entities.GetClients_Result>,
List<Shared.Models.Client>>(dbContext.GetClients(null).ToList());
}

并且异常只是返回到调用方法。 SQLAzureConnectionStrategy 不执行任何操作,不重试或执行任何操作。

请提供任何建议,如果 SQLAzureConnectionStrategy 无法捕获 EF 调用返回的异常,我将看不到它会做什么。

谢谢。

最佳答案

我就是这样做的。我使用 DbConfigurationType 属性用 DbConfigurationType 类装饰实体类。

[DbConfigurationType(typeof(DataContextConfiguration))]
public partial class MyEntity : DbContext
{
public static MyEntity CreateContext()
{
var context = new MyEntity();
((IObjectContextAdapter)context).ObjectContext.CommandTimeout = 180;

return context;
}
}


public class DataContextConfiguration : DbConfiguration
{
public DataContextConfiguration()
{
SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy(5, new TimeSpan(0, 0, 10)));
}
}

关于c# - SQLAzureExecutionStrategy ShouldRetryOn 未在 EF 异常上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35317359/

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