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

luv*_*ere 6 database synchronization

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

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

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

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

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

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

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