Frameworks 实体框架处理连接丢失
我们的应用程序使用EF 5和c#.net 4.5。由于我们的应用程序在世界各地与一台中央服务器一起使用,因此我们遇到超时和与服务器失去连接的问题 当前,我们捕获SaveChanges()方法并重试,直到用户取消。对于代码中的各种加载,我们能做些什么 编辑:我尝试了建议的解决方案,但无法正常工作:Frameworks 实体框架处理连接丢失,frameworks,entity,Frameworks,Entity,我们的应用程序使用EF 5和c#.net 4.5。由于我们的应用程序在世界各地与一台中央服务器一起使用,因此我们遇到超时和与服务器失去连接的问题 当前,我们捕获SaveChanges()方法并重试,直到用户取消。对于代码中的各种加载,我们能做些什么 编辑:我尝试了建议的解决方案,但无法正常工作: public class MyRetryStrategy : ITransientErrorDetectionStrategy { public bool IsTransient(Excepti
public class MyRetryStrategy : ITransientErrorDetectionStrategy
{
public bool IsTransient(Exception ex)
{
if (ex != null && ex is SqlException)
{
foreach (SqlError error in (ex as SqlException).Errors)
{
switch (error.Number)
{
case 1205:
System.Diagnostics.Debug.WriteLine("SQL Error: Deadlock condition. Retrying...");
return true;
case -2:
System.Diagnostics.Debug.WriteLine("SQL Error: Timeout expired. Retrying...");
return true;
case -1:
System.Diagnostics.Debug.WriteLine("SQL Error: Timeout expired. Retrying...");
return true;
}
}
}
if (ex != null && ex is EntityException)
{
ex = ex.InnerException;
foreach (SqlError error in (ex as SqlException).Errors)
{
switch (error.Number)
{
case 1205:
System.Diagnostics.Debug.WriteLine("SQL Error: Deadlock condition. Retrying...");
return true;
case -2:
System.Diagnostics.Debug.WriteLine("SQL Error: Timeout expired. Retrying...");
return true;
case -1:
System.Diagnostics.Debug.WriteLine("SQL Error: Timeout expired. Retrying...");
return true;
}
}
}
// For all others, do not retry.
return false;
}
}
Enity框架只抛出EntityExceptions,所以我添加了第二个代码路径
实际使用情况:
RetryPolicy policy = new RetryPolicy<MyRetryStrategy>(5, TimeSpan.FromMilliseconds(1000));
policy.ExecuteAction(()=>_context.ProductStatuses.Include(x => x.Name.Translations).Load());
RetryPolicy policy=new RetryPolicy(5,TimeSpan.frommicles(1000));
policy.ExecuteAction(()=>_context.productstatus.Include(x=>x.Name.Translations.Load());
MyRetryStrategy中的IsTransient方法永远不会被调用,也不会调用重试。我在通话前停止了数据库测试
我做错了什么 这个样本让我大开眼界 iSeries(如下)是您自己的自定义实现
private static void RetryPolityUsingCode(IUnityContainer container, IService service, OutputWriterService writer)
{
writer.WriteLine("Begin sample: RetryPolityUsingCode");
// Define your retry strategy: retry 5 times, starting 1 second apart
// and adding 2 seconds to the interval each retry.
var retryStrategy = new Incremental(5, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2));
// Define your retry policy using the retry strategy and the Windows Azure storage
// transient fault detection strategy.
var retryPolicy = new RetryPolicy<MyRetryStrategy >(retryStrategy);
try
{
// Do some work that may result in a transient fault.
retryPolicy.ExecuteAction(service.AMethodIDefinedInMyService);
}
catch (Exception exception)
{
// All the retries failed.
writer.WriteLine("An Exception has been thrown:\n{0}", exception);
}
writer.WriteLine("End sample: RetryPolityUsingCode");
}
private static void RetryPolityUsingCode(IUnityContainer容器、iSeries服务、OutputWriterService编写器)
{
WriteLine(“开始示例:retrypolitiyusingcode”);
//定义重试策略:重试5次,间隔1秒开始
//并在每次重试的间隔上增加2秒。
var retryStrategy=新增量(5,TimeSpan.FromSeconds(1),TimeSpan.FromSeconds(2));
//使用重试策略和Windows Azure存储定义您的重试策略
//瞬态故障检测策略。
var retryPolicy=新retryPolicy(retryStrategy);
尝试
{
//进行一些可能导致瞬时故障的工作。
retryPolicy.ExecuteAction(service.definedmyservice);
}
捕获(异常)
{
//所有的重试都失败了。
WriteLine(“已引发异常:\n{0}”,异常);
}
writer.WriteLine(“结束示例:retrypolitiyusingcode”);
}