6

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

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


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

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

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


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

4

6 回答 6

1

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

于 2009-02-05T00:04:04.970 回答
1

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

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

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

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

祝你好运!

于 2009-02-05T00:06:29.973 回答
1

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

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

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

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

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

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

于 2009-02-05T00:29:30.737 回答
0
  1. 你真的关心数据库独立性吗?
  2. 为每种具有相同公共接口的数据库类型创建不同的机制真的很难吗?

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

SQL Server 有类似的东西,但我从未使用过它。

于 2009-02-05T00:01:52.073 回答
0

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

于 2009-02-05T00:44:02.860 回答
0

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

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

于 2016-04-01T09:58:38.027 回答