我有一个在 Azure 中运行的使用 LINQ-TO-SQL 的相当大的 Web 应用程序,我遇到了来自 SQL-Azure 的瞬态错误,因此需要实现重试。我知道瞬态故障处理框架和几个提供如何使用它的示例的站点,但看起来您必须将每个 LINQ 查询包装在类似于以下内容的内容中:
RetryPolicy retry = new RetryPolicy<MyRetryStrategy>(5, TimeSpan.FromSeconds(5));
Result = retry.ExecuteAction(() =>
{
… LINQ query here...
});
在我的数据层中有数百个 LINQ 查询,这看起来真的很混乱,而且很多时候查询在结果被枚举之前并没有真正执行。例如,我的数据层中的大多数函数都将 IQueryable<> 返回到业务层(这使得它们比返回列表更灵活)。所以这意味着你必须用数据库重试逻辑乱扔你的业务逻辑层——丑陋。
所以我想为了将重试逻辑保留在数据层中,我必须将 .ToList()'s 放在我的所有查询中,以便它们在那里执行,而不是在上面的层中。
我真的希望有一种方法可以在某些基类中实现重试逻辑,而不必更改我的所有查询。好像EF也会有这个问题。
尝试与 SQL-Azure 团队进行自动重试是否是真正的答案,所以我们不必在代码中担心这一点?