实体框架 – 使用实体框架与SQL Azure – 可靠性
我正在为
Windows Azure编写应用程序.我正在使用Entity Framework访问SQL Azure.由于SQL Azure中的限制和其他机制,如果SQL语句失败,我需要确保我的代码执行重试.我试图想出一个坚实的方法来做到这一点.
(在下面的代码中,ObjectSet返回我的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; } 上述最新的解决方案被描述为在SQL Azure客户端应用程序(高级使用模式部分)中处理瞬态条件的http://blogs.msdn.com/b/appfabriccat/archive/2010/10/28/best-practices-for-handling-transient-conditions-in-sql-azure-client-applications.aspx最佳实??践. 这是向前迈进的一步,但是当我想通过实体框架访问数据库时,我仍然需要记住使用RetryPolicy类.在几个人的团队中,这是一件很容易错过的事情.此外,上面的代码在我看来有点凌乱. 我想要的是一种强制执行重试的方法,始终都是使用的.瞬态故障处理库包含一个名为ReliableSQLConnection的类,但我找不到使用实体框架的方法. 对这个问题有什么好的建议? 解决方法在上述说明之后,Microsoft创建了瞬态故障处理库,其中包括通过ReliableSqlConnection类直接支持与SQL Azure协同工作.http://msdn.microsoft.com/en-us/library/hh680899(v=pandp.50).aspx 想要使用Azure的大多数开发人员将会发现上述内容是非常有帮助的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- SQLserver查询数据类型为ntext是空或NULL值的方法
- sql-server – SQL Server 2008 – 使用命令行创建数据库脚
- 使用DBUtils连接Sqlserver插入失败的问题
- 编程方式访问多维数据集(SQLSERVER2005 Analysis Services
- SQLServer 2005 关于注册服务器的问题
- case when在sqlserver和oracle的不同写法
- entity-framework-4 – 如何在EntityFramework 4.3中为现有
- CentOS 7.2.1511 编译安装Nginx1.10.1+MySQL5.7.14+PHP7.0.
- 如何从SQL查询中提取数据并将其分配给Odoo类列?
- sql – 使用带有CRLF或LF的SSIS读取文本文件