【发布时间】:2014-01-31 15:29:17
【问题描述】:
我正在尝试为 EF6.02 配置弹性设置。我有一个应用程序,它在一个执行点将日志条目写入数据库。应用程序不依赖于 SQL 服务器,因此如果服务器没有响应,我希望应用程序放弃 INSERT 查询(通过 DbContext 的 SaveChanges)并立即继续执行。
使用默认设置,调试日志输出十个
“System.Data.dll 中发生了‘System.Data.SqlClient.SqlException’类型的第一次机会异常”
十次尝试后,它抛出一个异常,我的代码继续。但我只想要一次尝试,例如 2 秒命令超时。根据 MSDN 上的文档,SQL 服务器的默认弹性方法是:
DefaultSqlExecutionStrategy:这是默认使用的内部执行策略。此策略根本不会重试,但是,它将包装任何可能是暂时的异常,以通知用户他们可能希望启用连接弹性。
正如文档所述,此策略根本不会重试。但我仍然有十次重试。我试图创建一个继承 DbConfiguration 的类,但我没有找到任何关于如何更改它的文档。
谁能帮我减少重试次数?
更新:以下是基于建议的代码
using System;
using System.Data.Entity;
using System.Data.Entity.SqlServer;
using System.Data.Entity.Infrastructure;
using System.Runtime.Remoting.Messaging;
namespace MyDbLayer
{
public class MyConfiguration : DbConfiguration
{
public MyConfiguration ()
{
this.SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
? (IDbExecutionStrategy)new DefaultExecutionStrategy()
: new SqlAzureExecutionStrategy());
}
public static bool SuspendExecutionStrategy
{
get
{
return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false;
}
set
{
CallContext.LogicalSetData("SuspendExecutionStrategy", value);
}
}
}
}
以及写入 SQL 的代码
try
{
using (MyEntities context = new MyEntities ())
{
Log logEntry = new Log();
logEntry.TS = DateTime.Now;
MyConfiguration.SuspendExecutionStrategy = true;
context.Log.Add(logEntry);
context.SaveChanges();
}
}
catch (Exception ex)
{
logger.Warn("Connection error with database server.", ex);
}
finally
{
//Enable retries again...
MyConfiguration.SuspendExecutionStrategy = false;
}
【问题讨论】:
标签: c# sql .net database entity-framework