如何知道数据是不是已更改 [关闭]

Posted

技术标签:

【中文标题】如何知道数据是不是已更改 [关闭]【英文标题】:how to know if data has changed [closed]如何知道数据是否已更改 [关闭] 【发布时间】:2015-03-28 20:09:37 【问题描述】:

如果您在使用相同数据库的不同客户端上有一个桌面应用程序,如果一个客户端更改了数据,您如何通知其他客户端。假设您作为客户编号 1 正在查看具有不同客户的数据网格,并且客户编号 2 更新您在数据网格中查看的客户之一的名称。 1 号客户如何知道数据库的变化?我不认为解决方案是将每一秒都拉到服务器上。那么会有什么选择呢?

【问题讨论】:

这是一个非常复杂的应用程序设计,远高于新用户的水平。如果我们谈论的是通过 webapi 进行更新(不确定,您使用 asp.net 还指代桌面应用程序),那么您需要保持服务器和客户端之间的连接打开,例如 signalr。祝你好运。 广义地说,我希望客户端中的编辑通过服务器更改数据,服务器通过某种消息传递机制(例如 JMS、AMQP)广播更新通知等等。)。这将通知每个客户端执行刷新或类似操作。 您的问题太宽泛了,但是如果您阅读 Martin Fowlers 企业架构一书,他确实讨论了这种非常复杂的技术来解决它,并以您的应用程序为代价。我也会研究一致性。如果您的数据库是远程存储的,您可能会使用套接字来轮询连接。 【参考方案1】:

您可以使用SignalR 之类的技术来通知客户端发生了更改,并让他们有机会强制刷新(或者如果不会导致任何冲突,则可以静默更新表,也许通过淡化在新行中)。

这避免了不断轮询服务器以进行更改的需要。您仍然会遇到冲突(可能是客户端断开连接并进行更改),但您可以找出处理这些冲突的最佳方法以满足您的需求。

我在How to implement real time data for a web page 中与网络客户端讨论了几种实现此目的的方法。该技术与桌​​面应用程序类似,因为除了 javascript 之外,还有 SignalR clients available for .NET。

请注意,此技术不仅限于 SignalR。存在其他技术堆栈,例如 Socket.IO,但 SignalR 将与 .NET 进行最紧密的集成,因为它来自 Microsoft。

【讨论】:

【参考方案2】:

你可以看看Observer Pattern:

定义对象之间的一对多依赖关系,这样当一个 对象更改状态,通知并更新其所有依赖项 自动。

因此,本质上,每当客户端按下保存(或任何其他更改数据的操作)时,您的服务器都会向其客户端发送通知。然后客户端将检查此更改是否会影响用户。如果是这样,则客户端可以向服务器请求数据的新副本(最好在通知用户新数据可用之前)。

【讨论】:

这并不能真正回答问题,除了鸟瞰。接下来的逻辑问题将是“如何在没有服务器,只有数据库的桌面应用程序中实现观察者模式” @CodeCaster:假设可以访问服务器,可以在数据库和客户端之间编写一个薄层,如果您愿意,它将充当服务器。这也会阻止客户端直接访问数据库。 对于比 CRUD 做更多事情的普通应用程序,该层的实现不会很薄也不会微不足道。我要说的是,您的回答提出的问题多于回答的问题。

以上是关于如何知道数据是不是已更改 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我如何知道一个 mgo 会话是不是已关闭

如何确定用户是不是关闭已由 Excel 中的代码打开的 Access 应用程序

如何恢复或更改Oracle sysdba密码[关闭]

如何更改列中的项目? (我知道一些php,但我不是专家)[关闭]

如何检查 Windows Universal 10 应用程序是不是已关闭而不是最小化?

如何恢复或更改 Oracle sysdba 密码 [关闭]