【发布时间】: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