【问题标题】:DbExecutionStrategy retrying more than MaxRetryCountDbExecutionStrategy 重试次数超过 MaxRetryCount
【发布时间】:2016-03-20 01:54:34
【问题描述】:

我正在使用 DbExecutionStrategy 使我的程序在查询服务器时支持连接超时,但它没有按预期工作。

这是我的课:

public class MyExecutionStrategy : DbExecutionStrategy
{
    static MyExecutionStrategy()
    {
        RetriesPerInstance = new Dictionary<int, int>();
    }

    private const int MaxRetryCount = 5;
    private static TimeSpan _maxDelay = new TimeSpan(0, 0, 3);



    private int _instanceNo;

    public MyExecutionStrategy() : base(MaxRetryCount, _maxDelay)
    {
        _instanceNo = ++TotalInstances;
        RetriesPerInstance[_instanceNo] = 0;
    }

    public static Dictionary<int, int> RetriesPerInstance { get; private set; }

    public static int TotalRetries
    {
        get
        {
            return RetriesPerInstance.Values.Sum();
        }
    }

    public static int TotalInstances { get; private set; }

    protected override bool ShouldRetryOn(Exception ex)
    {
        RetriesPerInstance[_instanceNo]++;

        return true;
    }
} 

这是我的查询:

private void Form1_Load(object sender, EventArgs xe)
    {
        var dengineEntities = new dengineEntities();

        try
        {
            var proj = dengineEntities.motorista_erro.ToArray();
        }
        catch (Exception e)
        {
            var tries = MyExecutionStrategy.TotalRetries;
        }
    }

对于单个 ToArray,它返回 42 次重试,并在抛出 RetryLimitExceededException 之前实例化 14 次策略。

为什么它不会在 5 次尝试时停止,为什么它会为单个查询创建多个实例?有什么我没看到的吗?

这些是我的上下文类:

public partial class dengineEntities : DbContext
{
    public dengineEntities()
        : base("name=dengineEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<motorista_erro> motorista_erro { get; set; }

}
public partial class motorista_erro
{
    public int MOT_ID { get; set; }
    public string MOT_NOME { get; set; }
    public bool MOT_SIT_FUNC_ID { get; set; }
    public int IDEMP { get; set; }
}
<connectionStrings>
 <add name="dengineEntities" ...etc...etc../>
</connectionStrings>

【问题讨论】:

  • 您能否在表单控制器中显示获取连接/使用 ExecutionStrategy 的代码?
  • 更新了 Martin 但我使用的是实体框架,因此连接是基于 dengineEntities 连接字符串创建的......并且用于测试......我关闭我的网络以强制“无法连接”mysqlexception
  • 那么 ExecutionStrategy 连接在哪里,抱歉,如果我不太清楚想知道​​这一点。
  • 它是我在上面发布的我的公共类 MyExecutionStrategy。我将它设置在我的 dbconfigurationclass .....public class MyConfiguration : DbConfiguration { public MyConfiguration() { SetExecutionStrategy("MySql.Data.MySqlClient", () => new MyExecutionStrategy()); } }

标签: c# mysql entity-framework entity-framework-6


【解决方案1】:

它在重试5次时停止,查看RetriesPerInstance屏幕截图中的值,每个有6或0。6次重试意味着它重试了5次,第6次停止了。

所以听起来您的问题出在其他地方。 Form1_Load 被调用了多少次?

【讨论】:

  • 是的 6 是正确的,但我不同意的总实例......只有一次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2022-08-11
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
相关资源
最近更新 更多