客户端-服务器数据库应用程序:如何通知客户端数据已更改?

9

是否有可能知道数据库中特定表的内容何时以及是否更改?如何使我的SQL Server通知客户端应用程序数据已被其他用户更改?如何使用dbGo实现查询通知?

我的客户端需要轮询数据库吗,还是有回调机制可以处理此问题?

我的客户端是一个Delphi应用程序,使用TADODataSet,我的服务器是服务于多个客户端的SQL Server 2005/2008。


1
可能是重复问题 https://dev59.com/JGHVa4cB1Zd3GeqPm3Ja - TLama
1
@TLama,目前还没有关于TADODataSet和SQL Server的确定解决方案。 - ZigiZ
1
如果这个答案是正确的,那么*dbGo (ADO)*不支持通知... - TLama
3
这个更好:https://dev59.com/jVzUa4cB1Zd3GeqP3G-j,然而答案仍然是否定的,dbGo不支持查询通知。 - TLama
1
这就是为什么我更喜欢使用Delphi框架的Bold。它可以在数据库更改时自动更新客户端,非常方便。当然,还有很多其他功能可以加快开发速度。 - Roland Bengtsson
2个回答


1
不,您需要构建自己的“中间层”来实现此功能。最简单的方法是轮询服务器。更复杂的解决方案是构建自己的“中间层”服务器,轮询数据库并向客户端推送通知(使用自己的客户端连接)。
一个折中的解决方案是在服务器上有一个单独的客户端轮询您需要“监视”的表,并将“通知标志”写入另一个数据库表中,可以由客户端轮询。至少这样,客户端可以轮询一个包含最小数据的简单表,列出已更改的内容,然后可以通过另一个选择查询读取。客户端的工作量要少得多。

还有一种“折中”的方法:记录更改的数据库客户端应用程序本身(包括应用程序服务器端逻辑)可以通过中间层向所有正在监听的客户端发送广播“记录已更改!”消息。这将是一种“立即”通知其他应用程序进行更改的方式。此外,您的“服务器上的单独客户端”可以在较长的时间间隔内运行,以减少轮询的数量,并且每次接收到客户端生成的通知消息时都可以跳过轮询周期... - mjn

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