在SQL Azure上重试LINQ-TO-SQL逻辑 - 高效实现?

Pet*_*ack 6 linq-to-sql azure-sql-database

我有一个使用在Azure中运行的LINQ-TO-SQL的相当大的Web应用程序,我遇到来自SQL-Azure的Transient错误,因此需要实现重试.我知道Transient Fault Handling Framework和一些提供示例如何使用它的站点,但看起来你必须将每个LINQ查询包装成类似于下面的内容:

RetryPolicy retry = new RetryPolicy<MyRetryStrategy>(5, TimeSpan.FromSeconds(5));
Result = retry.ExecuteAction(() =>
{
   … LINQ query here...
});
Run Code Online (Sandbox Code Playgroud)

在我的数据层中有数百个LINQ查询,这看起来非常混乱,而且很多时候查询在枚举结果之前并没有实际执行.例如,我的数据层中的大多数函数都将IQueryable <>返回到业务层,这使得它们比返回List更灵活.因此,这意味着您必须使用数据库重试逻辑来丢弃业务逻辑层 - 这很丑陋.

所以我想为了保持数据层中的重试逻辑,我必须在我的所有查询上放置.ToList(),以便它们在那里执行,而不是在上面的层中.

我真的希望有一种方法可以在某些基类中实现重试逻辑,而不必更改我的所有查询.好像EF也会遇到这个问题.

尝试和SQL-Azure团队进行自动重试是真正的答案,所以我们不必在代码中担心这一点吗?

Min*_*SFT 0

我\xe2\x80\x99m不知道一个好的解决方案,因为LINQ to SQL不允许我们拦截查询。但稍微重构一下代码可能会有所帮助。类似于(伪代码):

\n\n
public Result QueryWithRetry(IQueryable query)\n{\n      RetryPolicy retry = new RetryPolicy<MyRetryStrategy>(5, TimeSpan.FromSeconds(5)); \n     (() => \n     { \n       return retry.ExecuteAction(query);\n     }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在调用这个方法稍微容易一些:

\n\n

结果 = QueryWithRetry(\xe2\x80\xa6 LINQ 查询此处...);

\n\n

但是,仍然需要修改代码并更改每个查询。

\n\n

此致,

\n\n

明旭.

\n