我们开发了一个在 MS SQL Server 上运行的 C# WinForms 应用程序。直到今天,我们仍在使用一个非常简单的自制 OR-Mapper(使用反射)以及通过单例模式实现的廉价缓存机制。有一个用户触发的“重置”功能。该体系结构是一个简单的两层(客户端、服务器)三层(客户端上的表示和逻辑,服务器上的 MS SQL 作为数据层)。
通常我们加载大约 300 行和大约 30 列,这些列经常变化(以及其他一些很少变化的表)。此应用程序的不同实例在不同的客户端计算机上运行,加载了相同的 300 行,并且正在更改随机行上的数据。应用程序立即更新数据库上的数据。在这样做之前,会检查完整性,以便用户在出现问题时得到反馈。但对于用户在屏幕上看到旧值的某些行,当他想确保拥有最新数据时,他必须手动重置缓存。
如果应用程序考虑更改的行本身,那就太好了。每隔几秒就有更新。但其中只有一些更新与其他应用程序相关(取决于事件过滤器...)
我想到的解决方案:
- 使用带有公共(public)缓存的 OR-Mapper(例如带有集群缓存的 NHibernate)
- 悬而未决的问题:这些二级缓存是为客户端应用程序设计的吗?当缓存发生更改时,我可以触发 UI 更新吗?其他基于 OR-Mapper 的解决方案?
- 使用应用程序服务器实现另一层,将逻辑移至此应用程序服务器。仅运行一个实例,该实例缓存数据并在逻辑对象上发送事件,通知其他客户端更新的数据。不要在客户端上缓存任何数据。
- 未决问题:在应用服务器上加载?与应用程序服务器的开销通信?将逻辑 DLL 移动到应用程序服务器的工作量......?报告的数据源(直接/应用服务器)?
- 类似于此用户认为的内容:https://stackoverflow.com/questions/7593884/what-technology-to-use-for-data-persistence-cache-and-synchronization-in-n-tier
- 在逻辑级别添加某种数据更改通知(基于广播的通知...)
- 未决问题:现有库?在 SQL Server 上加载?
- 完全不同的解决方案?
我知道我在这里没有得到解决方案。只需要一些关于这些解决方案(或新解决方案)的想法...感谢您的任何意见!
最佳答案
我想在这里分享我的经验。在类似的情况下,所有客户端都在一个公司 LAN 上。我在客户端应用程序中实现了一个 UDP 客户端(发送方/接收方),每当客户端更新数据时,它就会在网络广播地址上广播“DataRefreshMessage”。所有其他客户端在收到“DataRefreshMessage”后都会更新其 View 。
我知道 UDP 并不可靠,但对于我的要求来说足够可靠,并且我的解决方案工作得很好。
关于c# - 全网数据同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8125582/