使数据库服务器的所有客户端保持同步的最佳策略是什么?
该场景涉及一个数据库服务器和连接到该服务器的动态数量的客户端,用于查看和修改数据。
我需要跨所有客户端的数据实时同步-如果数据被添加、删除或更新,我希望所有客户端都能实时看到更改,而不会通过连续轮询几百万行的表中的更改而给数据库引擎带来太大压力。
现在我使用的是Firebird数据库服务器,但我愿意采用最好的技术来完成这项工作,所以我想知道这种情况下是否有任何现有的框架,它使用什么数据库引擎,它涉及到什么?
发布于 2009-11-21 04:41:22
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来实现消息队列。这是可以做到的,但你基本上是在重新发明轮子。
以下是一些广受好评的消息队列产品:
这意味着,当一个客户端以其他客户端可能需要知道的方式修改数据时,该客户端还必须向消息队列发送一条消息。当消费者客户端看到他们感兴趣的消息时,他们知道要刷新一些数据的副本。
发布于 2009-11-21 04:04:34
SQL Server2005及更高版本支持基于通知的数据源缓存过期。
https://stackoverflow.com/questions/1772903
复制相似问题