【问题标题】:Some data changes in the database. How can I trigger some C# code doing some work upon these changes?数据库中的一些数据更改。如何触发一些 C# 代码对这些更改做一些工作?
【发布时间】:2009-02-04 23:57:15
【问题描述】:

假设我有一些带有数据库的应用程序 A。现在我想添加另一个应用程序 B,它应该跟踪应用程序 A 的数据库更改。当数据发生更改时,应用程序 B 应该进行一些计算。两个应用程序之间没有直接通信。两者都只能看到数据库。

基本问题是:数据库中的一些数据变化。如何触发一些 C# 代码对这些更改执行一些工作?


为了给答案一些刺激,我提到了一些我目前正在考虑的方法:

  1. 让应用程序 B 轮询 感兴趣的表的变化。 优点:方法简单。 缺点:流量大, 尤其是当很多桌子 参与。
  2. 引入将触发的触发器 在某些事件上。当他们开火时 他们应该写一些条目到 “事件表”。仅限应用程序 B 需要轮询那个“事件表”。 优点:流量少。 缺点:逻辑被放入 触发器形式的数据库。 (这不是问题 触发器的“邪恶”。这是一个设计 问题,这使它成为 劣势。)
  3. 摆脱轮询方法和 使用 SqlDependency 类获取 通知更改。优势: (也许?)流量比轮询少 方法。缺点:不是数据库 独立的。 (我知道 ODP.NET 中的 OracleDependency,但是什么 关于其他数据库?)

哪种方法更有利?也许我在上述方法中错过了一些主要(不利)优势?也许还有一些我没有想到的其他方法?


编辑 1:数据库独立性是……让我们称他们为……“销售人员”的一个因素。我可以使用 SqlDependency 或 OracleDependency。对于 DB2 或其他数据库,我可以回退到轮询方法。这只是一个成本和收益的问题,我至少想考虑一下,以便我可以讨论它。

【问题讨论】:

    标签: c# database ado.net odp.net


    【解决方案1】:

    我会选择#1。它实际上并没有您想象的那么多流量。如果您的数据不经常更改,您可能会对此感到悲观,并且只获取一些让您对表更改表示赞同或反对的内容。

    如果您在设计架构时考虑到了轮询,那么每次轮询可能不会真正产生那么大的影响。

    • 如果您只是添加记录,而不是更改它们,那么在特定表上检查最高 id 可能就足够了。

    • 如果您要全部更新它们,则可以存储时间戳列并为其编制索引,然后查找最大时间戳。

    • 您可以发送一个 ubber 查询,该查询会(有效地)轮询多个表并返回已更改表的列表。

    这个答案没有什么特别聪明的,我只是想表明#1 可能不像最初看起来那么糟糕。

    【讨论】:

      【解决方案2】:

      我会选择解决方案 #1(轮询),因为避免独立应用程序之间的依赖关系和直接连接有助于降低复杂性和问题。

      【讨论】:

        【解决方案3】:

        我认为您已经涵盖了我想到的方法,没有绝对的“最佳”方法,重要的是您的要求和优先事项。

        我个人喜欢 SqlDependency 类的优雅;无论如何,对于大多数应用程序来说,数据库独立性在现实世界中的重要性是什么?但是,如果您优先考虑拥有数据库独立性,那么您就不能使用它。

        轮询是我的第二个最爱,因为它使数据库免受触发器和应用程序逻辑的影响;无论如何,这确实不是一个坏选择,因为正如您所说,它很简单。如果应用程序 B 可以在“注意到”数据库更改之前一次等待几分钟,那将是一个不错的选择。

        所以我的回答是:视情况而定。 :)

        祝你好运!

        【讨论】:

          【解决方案4】:
          1. 您真的关心数据库独立性吗?
          2. 真的很难为每种具有相同公共接口的数据库类型创建不同的机制吗?

          我知道 ODP.NET 中的 OracleDependency,但是其他数据库呢?

          SQL Server 有类似的东西,但我从来没有用过。

          【讨论】:

            【解决方案5】:

            你可以创建一个 MySqlDependency 类,并实现 SqlDependency 或 SqlDependencyForOracle(池化)

            【讨论】:

              【解决方案6】:

              您可以在 SQL CLR Database Project 中使用 SQL 触发器并在该项目中运行您的代码,请参阅:https://msdn.microsoft.com/en-us/library/938d9dz2.aspx

              或者,在SQL CLR Database Project 内的触发器上,您可以从SQL CLR Database Project 向您实际想要在触发器上操作的项目发出请求。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-05-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-08-26
                相关资源
                最近更新 更多