我正在为Windows Azure编写一个应用程序。我正在使用实体框架来访问SQL Azure。由于SQL Azure中的限制和其他机制,如果SQL语句失败,我需要确保我的代码执行重试。我试图想出一个坚实的方法来做到这一点。在SQL Azure中使用实体框架 - 可靠性
(在下面的代码,对象集返回我的EFContext.CreateObjectSet())
比方说,我有这样的功能:
public Product GetProductFromDB(int productID)
{
return ObjectSet.Where(item => item.Id = productID).SingleOrDefault();
}
现在,这个函数不进行重试,并会更快失败或更高版本在SQL Azure中。一个天真的解决方法是做这样的事情:
public Product GetProductFromDB(int productID)
{
for (int i = 0; i < 3; i++)
{
try
{
return ObjectSet.Where(item => item.Id = productID).SingleOrDefault();
}
catch
{
}
}
}
当然,这有几个缺点。无论SQL失败,我都会重试(如果它是主键违例,重试会浪费时间),我会立即重试,不会有任何暂停,等等。
我的下一步是开始使用Microsoft的瞬态故障处理库。它包含RetryPolicy,让我重试逻辑与实际查询代码分开:
public Product GetProductFromDB(int productID)
{
var retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(5);
var result = _retryPolicy.ExecuteAction(() =>
{
return ObjectSet.Where(item => item.Id = productID).SingleOrDefault;
});
return result;
}
最新溶液上方被描述为http://blogs.msdn.com/b/appfabriccat/archive/2010/10/28/best-practices-for-handling-transient-conditions-in-sql-azure-client-applications.aspx最佳实践在SQL Azure中客户端应用程序处理过渡工况(高级使用模式部分) 。尽管这是向前迈进的一步,但我仍然必须记住,只要我想通过实体框架访问数据库,就要使用RetryPolicy类。在一个由几个人组成的团队中,这是一件容易错过的事情。此外,我认为上面的代码有点麻烦。
我想要的是一种强制执行的方式,始终使用重试。 Transient Fault Handling库包含一个名为ReliableSQLConnection的类,但是我找不到在Entity Framework中使用它的方法。
对这个问题有什么好的建议?
这个答案没有回答这个问题 - 问题是是否有可能不记得要使用RetryPolicy每次调用。您提供的链接并未显示如何做到这一点,事实上表明您确实需要打包每个电话。 – 2013-06-17 16:32:24