【问题标题】:What would be a best way to notify an application (C++ or Java) when underlying DB changes?当底层数据库更改时,通知应用程序(C++ 或 Java)的最佳方式是什么?
【发布时间】:2009-12-30 20:43:53
【问题描述】:

我正在编写一个 C++ 控制台应用程序,它需要响应数据库表的特定字段的变化。尽管我可以继续发送查询以定期检查该字段,但我想避免这种情况,因为该应用程序的多个实例可能正在运行。我听说过 SQL Server 2005 的查询通知功能,但似乎该功能不适用于我的设置(SQL Server 2000)。在这种情况下,实现此功能的最佳方法是什么?

【问题讨论】:

    标签: java c++ sql-server


    【解决方案1】:

    您只能定期轮询更改。绝对没有办法从 SQL Server 2000 获得通知。所有相反的说法都是白日做梦。

    通过 OLE 自动化(sp_oa 方法)、通过扩展过程、通过 xp_cmdshell 或任何类似的方式执行任何类型的外部通知的触发器都不起作用。首先是性能问题:您希望数据库做的最后一件事是阻止触发器等待外部进程响应。其次,在事务环境中通常会忽略正确性的小细节:如果封闭事务回滚,则在触发器期间发送的任何通知都必须“未发送”。实现这一点的唯一方法是使用通知机制(例如 MSMQ)注册分布式事务,这意味着吞吐量从每秒数百/数千下降到个位数。

    不要去那里。升级到 SQL 2005 并使用 QN,这是唯一的主动更改通知机制。或者满足于定期轮询最近的更改。

    【讨论】:

    • 单词pull的每个实例都应该是poll
    • “如果封闭事务回滚,则在触发期间发送的任何通知都必须‘未发送’”。使用正确的语义不一定正确:一条消息说“可能已经改变,你应该现在轮询数据库”不必在失败时撤消。但是,如果它是在事务提交之前发送的,我猜你会有一个不同的无法解决的问题,它可能会过早地采取行动。
    • @Steve:是的,可以将通知视为暂定的。但这也带来了一系列问题。如果这个问题很容易解决,就不必发明分布式事务了。
    【解决方案2】:

    我会这样做。

    您的控制台应用程序负责检查表中特定列的值何时在该列的任何位置发生更改(更新、删除、插入等)。

    第 1 步 - 不要将控制台应用程序指向数据库,创建一个 MSMQ 并让它看起来在那里

    第 2 步 - 创建第二个控制台应用程序,其唯一工作就是向上述 MSMQ 写入值

    第 3 步 - 在相关表上创建一个触发器,以从第 2 步执行控制台应用程序。

    【讨论】:

      【解决方案3】:

      我认为通知服务本身可以在 SQL Server 2000 上运行。

      看看这些文章:

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        我认为你应该为此使用触发器。

        当表字段发生变化时,触发器被触发并使用任何 IPC 机制通知其他应用程序或在注册表或临时文件中写入必要的信息。

        【讨论】:

        • 你能说得更具体一点吗?如何使用触发器来通知应用程序?谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-07
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-11
        相关资源
        最近更新 更多