【问题标题】:Real-time synchronization of database data across all the clients跨所有客户端实时同步数据库数据
【发布时间】:2009-11-20 20:01:14
【问题描述】:

保持数据库服务器的所有客户端同步的最佳策略是什么?

该场景涉及数据库服务器和连接到它、查看和修改数据的动态数量的客户端。

我需要跨所有客户端实时同步数据 - 如果添加、删除或更新数据,我希望所有客户端都能实时查看更改,而不会对数据库引擎造成太大压力连续轮询具有几百万行的表中的更改。

现在我正在使用 Firebird 数据库服务器,但我愿意采用最好的技术来完成这项工作,所以我想知道是否有任何已经存在的框架用于这种场景,数据库引擎是做什么的它的用途和作用是什么?

【问题讨论】:

  • 您是否期望客户会以某种方式“推送”给他们(更多可能是通知),或者更确切地说(更容易做到......),在移动刷新时,移动结果设置并通常重新查询数据库,他们会得到最新的数据吗?
  • 我在数据绑定场景中考虑得更多,因为我的前端在 WPF 中。

标签: database synchronization


【解决方案1】:

Firebird 有一个名为EVENT 的功能,您可以使用它来通知客户端数据库的更改。这个想法是,当表中的数据发生变化时,触发器会发布一个事件。 Firebird 负责按名称通知所有对活动感兴趣的客户。收到通知后,每个客户端负责通过查询数据库来刷新自己的数据。

客户端无法从事件中获取有关新值或旧值的信息。这是设计使然,因为没有办法通过事务隔离来解决这个问题。您的客户也不能使用通配符注册事件。因此,您必须非常广泛地设计服务器到客户端的通知,并让客户端更新以查看到底发生了什么变化。

http://www.firebirdsql.org/doc/whitepapers/events_paper.pdf

您没有提及您使用的客户端平台或语言,因此我无法就您将使用的特定 API 提供建议。我建议您根据您使用的语言在 Google 上搜索“firebird event java”或“firebird event php”或类似内容。


由于您在评论中说您正在使用 WPF,因此这里有一个代码示例的链接,该链接指向一些注册事件通知的 .NET 应用程序代码的代码示例:

http://www.firebirdsql.org/index.php?op=devel&sub=netprovider&id=examples#3


关于您的评论:是的,Firebird 事件机制在承载信息的能力方面受到限制。这是必要的,因为它可能携带的任何信息都可能被取消或回滚。例如,如果触发器发布了一个事件,但生成触发器的操作违反了约束,则取消操作而不是事件。所以事件只能是一种“暗示”,可能发生了一些有趣的事情。其他客户端此时需要刷新他们的数据,但他们没有被告知要查找什么。这至少比轮询好。

所以你基本上是在描述一个发布/订阅机制——一个消息队列。我不确定我是否会使用 RDBMS 来实现消息队列。可以做到,但你基本上是在重新发明轮子。

以下是一些广受好评的消息队列产品:

这意味着当一个客户端以其他人可能需要知道的方式修改数据时,该客户端必须将消息发布到消息队列。当消费者客户看到他们感兴趣的消息时,他们知道要刷新他们的一些数据副本。

【讨论】:

  • 谢谢,我知道事件,我遇到的问题是知道哪些行发生了变化,因此我可以避免每次收到事件时将客户端数据与服务器数据进行比较。您是否认为也许我应该通过一个存储过程进行插入/更新/删除,该存储过程还将在我收到事件时可以查询的不同表中写入最新更改?
【解决方案2】:

SQL Server 2005 及更高版本支持基于通知的数据源缓存到期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    相关资源
    最近更新 更多