跨所有客户端实时同步数据库数据

时间:2009-11-20 20:01:14

标签: database synchronization

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

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

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

现在我正在使用Firebird数据库服务器,但是我愿意为这项工作采用最好的技术,所以我想知道这种情况是否存在任何已有的框架,数据库引擎是什么它的用途和涉及的内容是什么?

2 个答案:

答案 0 :(得分:5)

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来实现消息队列。它可以做到,但你基本上重新发明轮子。

以下是一些备受推崇的消息队列产品:

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

答案 1 :(得分:1)

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