【问题标题】:How to handle issues with Connections cannot be made(either DB or external systems) when multiple connections are available当多个连接可用时,如何处理连接问题(数据库或外部系统)
【发布时间】:2011-04-13 01:20:15
【问题描述】:

我对处理多个连接有疑问。这些连接可以是 DB 连接、SOA 连接、EMS 连接等.....

假设我有 1 个用于提取数据的数据库连接,并且我有 2 个 EMS 连接,它们都具有不同的数据且独立。数据发送到EMS,无论数据发送成功与否都会更新状态。

1) 如果数据库连接断开或其他无法访问数据库的问题 2) 任何 1 个 EMS 连接已关闭,应用程序应继续处理其他 EMS 连接。 3) 如果我们能够向 EMS 发送数据,但无法更新数据库问题的 DB 状态 bcos,我们应该如何处理内存中所有需要发送到 EMS 的消息。 4) 无法建立与 1 个 EMS 的连接,但另一个能够建立,因此应用程序应处理该 EMS 消息。

这些是我必须处理的一些 -ve 测试用例。如果还有其他需要解决的问题,请随时告诉我

【问题讨论】:

    标签: c# error-handling connection integration-testing ems


    【解决方案1】:

    到不同来源的多个连接,听起来是 System.Transactions 的一个很好的解决方案(如果 EMS 支持的话)。

    尝试这样的事情,这样所有 3 个操作都成功或失败作为一个工作单元。

            try
            {
                using (TransactionScope tran = new TransactionScope())
                {
                    Method1Save(); //DB
                    Method2Save(); //EMS1
                    Method3Save(); //EMS2
                    tran.Complete();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problem " + ex.ToString());
            }
    

    如果 EMS 不支持 TransactionScope,那么您将不得不手动处理它,可能通过将事务放在连接本身上,然后在操作成功后提交所有事务,这意味着为每个连接保持更长的打开时间数据源。

    【讨论】:

    • 我已经在使用 TransactionScope。让我给你一个例子。我们从数据库中读取数据。假设我们有 500 条记录,我们运行 5 个线程来处理数据并发送到 EMS。如果 EMS 无法接受消息,我们应该怎么办?队列已满或某些连接问题,我们是否已重新启动应用程序或等待或一段时间再试一次。如果重试多少次以及其他线程呢,如果我们已经知道它失败了,我们是让其他线程尝试发送消息还是让所有线程等待一段时间再试一次。
    • 另一种情况。如果我们想将状态更新到 DB,则该消息发送成功或失败。如果我们将消息发送到 EMS,但无法更新问题的 DB bcos,会发生什么情况。我们是让其他消息发送到EMS还是等到DB连接解决,bcos如果状态没有更新,那么它将尝试再次发送我们已经发送过的相同消息。
    • @Bunny - 对于线程失败,可能会在取消所有其他线程之前设置线程失败数的阈值。如果出现轻微故障,您不想停止(可以重新排队失败),但如果数据库已关闭,则无需纠缠它。此外,您可能会更仔细地查看数据库错误,看看是否将连接错误与非连接错误分开。
    • @Bunny - 如果您将消息发送到 BMS 并且 DB 已关闭,那么您需要将消息存储在临时存储中,直到 DB 备份。也许这是在内存中,或者以 XML 或其他格式保存到文件系统中。然后,一旦数据库备份,您将在处理任何新消息之前首先在临时存储中处理发送的消息。基本上你需要一个辅助存储系统来处理这种情况来临时保存消息,直到它可以保存到数据库中。
    • 我必须将消息发送到 2 个 EMS 队列。假设第一个队列已关闭并且第二个队列正在工作。如果线程数为 3。所有 3 个线程都将消息发送到已关闭的第一个队列。我正在使用辅助存储,但这仅适用于失败的消息,并且失败的消息在另一个线程上重试,该线程是单线程以维持顺序。因此,每次完成任何 EMS 时,都会处理所有其他 EMS 消息。当所有消息都完成后,我们会收到除失败消息之外的新消息,因为它必须首先处理失败的消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2021-12-21
    相关资源
    最近更新 更多