数据库数据的实时同步在所有客户端之间

6
什么是保持数据库服务器所有客户端同步的最佳策略?
该场景涉及一个数据库服务器和动态数量的客户端连接到它,查看和修改数据。
我需要实时同步所有客户端之间的数据 - 如果添加、删除或更新数据,我希望所有客户端能够实时查看到更改,而不会对拥有几百万行的表进行连续轮询以使数据库引擎过载。
现在我正在使用Firebird数据库服务器,但我愿意采用最适合此工作的技术,所以我想知道是否存在任何已经存在的框架适用于这种情况,它使用哪种数据库引擎,以及它涉及什么?

你的期望是客户端会以某种方式“推送”这些更改给他们(或者可能是通知),还是(更容易做到的是...)在移动、刷新、移动结果集和重新查询数据库时,他们会获得最新的数据? - mjv
我更多地考虑数据绑定的情况,因为我的前端是WPF。 - luvieere
2个回答

5
Firebird有一个名为EVENT的功能,您可以使用它来通知客户端数据库更改。这个想法是当表中的数据更改时,触发器会发布事件。 Firebird负责按名称通知所有已注册对事件感兴趣的客户端。一旦得到通知,每个客户端都负责通过查询数据库来刷新自己的数据。
客户端无法从事件中获取有关新值或旧值的信息。这是出于设计考虑,因为没有办法通过事务隔离解决这个问题。您的客户端也不能使用通配符注册事件。因此,您必须将服务器对客户端的通知设计得相当广泛,并让客户端更新以了解确切的变化。
请参见http://www.firebirdsql.org/doc/whitepapers/events_paper.pdf 您没有提及您使用的客户端平台或语言,因此我无法建议您需要使用的特定API。我建议您根据所使用的语言搜索“firebird event java”或“firebird event php”等实例。

既然您在评论中提到正在使用WPF,这里有一个链接,其中包含一些.NET应用程序代码示例,用于注册事件通知:

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


关于您的评论:是的,Firebird事件机制在携带信息方面有限制。这是必要的,因为它可能携带的任何信息都可能被取消或回滚。例如,如果触发器发布了一个事件,但生成触发器的操作违反了约束条件,则会取消操作而不是事件。因此,事件只能是某些感兴趣事情的“提示”。其他客户端需要在那时刷新他们的数据,但他们不会被告知要查找什么。至少这比轮询要好。
所以,您基本上描述了一种发布/订阅机制--消息队列。我不确定是否应该使用RDBMS来实现消息队列。虽然可以做到,但实际上是重复造轮子。
以下是一些备受推崇的消息队列产品:

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


谢谢,我知道事件的存在,但我的问题是如何知道哪些行发生了变化,这样我就可以避免每次接收事件时都要比较客户端数据和服务器数据。您认为我是否应该通过存储过程进行插入/更新/删除,并将最新更改写入一个不同的表中,以便在接收事件时查询? - luvieere

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接