2011-05-02 12 views
14

我正在为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中使用它的方法。

对这个问题有什么好的建议?

回答

7

经过以上评论,Microsoft创建了瞬态故障处理库,该库“包括直接支持通过ReliableSqlConnection类与SQL Azure协同工作”。

http://msdn.microsoft.com/en-us/library/hh680899(v=pandp.50).aspx

希望使用Azure的大多数开发人员会发现上面有很大的帮助。

+0

这个答案没有回答这个问题 - 问题是是否有可能不记得要使用RetryPolicy每次调用。您提供的链接并未显示如何做到这一点,事实上表明您确实需要打包每个电话。 – 2013-06-17 16:32:24

3

如果您使用实体框架6(目前在阿尔法)则是与Azure的SQL数据库重试瞬时一些新的内置支持(与配置的一点点):我创建了一个http://entityframework.codeplex.com/wikipage?title=Connection%20Resiliency%20Spec

库允许您配置实体框架使用故障处理模块进行重试,而无需更改每个数据库调用 - 通常您只需要更改配置文件以及可能的一两行代码即可。

这使您可以将它用于实体框架< v6或Linq To Sql。

https://github.com/robdmoore/ReliableDbProvider