【问题标题】:Transient Fault Handling For Reliable Connection On DataContextDataContext 上可靠连接的瞬态故障处理
【发布时间】:2015-03-26 13:03:34
【问题描述】:

我有一个 WCF 数据服务,它使用 DBML 文件生成我的 DataContext 所需的所有代码。我的数据库在 SQL Azure 业务层上运行(因此仍然使用共享模型),并且我正在使用瞬态故障处理应用程序块来包装我的所有调用。

我看到的问题是我仍然在“超时已过期”周围收到一些 SqlExceptions。我的重试策略与 Retrying 事件挂钩以记录任何重试,但除了超时异常外,我从未在日志中看到任何内容。

根据我的研究,Retry 块似乎只重试查询并假定它具有可靠的连接。但是,由于我使用的是 DataContext,因此我实际上无法控制设置该连接,并且由于我现有的所有代码都是 Linq2Sql,因此我不想切换它。

我错过了一些简单的东西吗?似乎没有任何方法可以告诉 DataService CurrentDataSource 应该是一个可靠的连接,或者无论如何使用 RetryManager 来使用连接本身的策略。

这是我的一个 ServiceOperations 的示例:

[WebGet]
    public MyTable GetDetailsById(string id)
    {
        try
        {
            var detail = retryPolicy.ExecuteAction<MyTable>(() =>
                CurrentDataSource.MyTable
                .Where(l => l.id == id)
                .FirstOrDefault());

            return detail;
        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.Message);
        }
    }

有什么想法吗?

更新:我的查询不会超过 30 秒。

【问题讨论】:

    标签: linq-to-sql azure-sql-database wcf-data-services


    【解决方案1】:

    当客户端在 x 秒内未从服务器获得响应时,会发生命令超时。这不是暂时性错误,因此重试逻辑不会处理。一般建议是将 Azure SQL 数据库的命令超时更改为至少 30 秒。此外,如果您有长时间运行的查询,则应考虑将这些查询的超时时间增加到超出应用程序范围的默认值。

    关于如何设置命令超时的文档可以在here找到。

    【讨论】:

    • 为了论证,假设查询时间不超过 30 秒。问题仍然存在,我如何使用 DataContext 获得与 L2S 的可靠连接?
    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多