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团队进行自动重试是真正的答案,所以我们不必在代码中担心这一点吗?
我\xe2\x80\x99m不知道一个好的解决方案,因为LINQ to SQL不允许我们拦截查询。但稍微重构一下代码可能会有所帮助。类似于(伪代码):
\n\npublic Result QueryWithRetry(IQueryable query)\n{\n RetryPolicy retry = new RetryPolicy<MyRetryStrategy>(5, TimeSpan.FromSeconds(5)); \n (() => \n { \n return retry.ExecuteAction(query);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n现在调用这个方法稍微容易一些:
\n\n结果 = QueryWithRetry(\xe2\x80\xa6 LINQ 查询此处...);
\n\n但是,仍然需要修改代码并更改每个查询。
\n\n此致,
\n\n明旭.
\n