[C#]如何在LINQ to SQL中引入重试逻辑来处理超时?

Chr*_*ris 5 c# linq linq-to-sql

LINQ to SQL用于在我的代码中调用一些sprocs,我需要找到在我的数据库调用中添加重试机制的方法...

using (MyDataContext dc = new MyDataContext())
{
    int result = -1; //denote failure
    int count = 0;

    while ((result < 0) && (count < MAX_RETRIES))
    {
        result = dc.myStoredProc1(...);
        count++;
    }

    result = -1;
    count  = 0;
    while ((result < 0) && (count < MAX_RETRIES))
    {
        result = dc.myStoredProc2(...);
        count++;
    }

    ...

    ...
}
Run Code Online (Sandbox Code Playgroud)

不确定上面的代码是否正确或是否有任何复杂性.

MAX_RETRIES到达后抛出一个异常会很好,但我不知道如何以及在哪里适当地抛出它们:-)

任何帮助赞赏.

Mar*_*ann 3

如果数据库超时,它不太可能在几毫秒后及时响应。

按照您的建议在紧密循环中重试可能会使情况变得更糟,因为您会给数据库服务器带来过度的负担,并且会占用调用代码中的线程。在每次重试之间引入等待时间会更安全。

对于更高级的场景,您可以考虑渐进式等待模式,在开始时更频繁地重试,然后如果仍然超时,则间隔越来越长。

您可能还想研究《Release It!》一书中的断路器设计模式。,以及该书中描述的许多其他模式和反模式。

状态模式非常适合实现断路器。