网络数据同步

时间:2011-11-14 17:30:30

标签: c# nhibernate architecture appserver

我们开发了一个在MS SQL Server上运行的C#WinForms应用程序。直到今天,我们使用一个非常简单的自制OR-Mapper(使用Reflection)和一个用单例模式实现的廉价缓存机制。用户触发了“重置”功能。该体系结构是一个简单的两层(客户端,服务器)三层(客户端上的表示和逻辑,MS SQL作为服务器上的数据层)。

通常我们加载大约300行,大约30列,这些列经常变化(以及其他一些很少变化的表)。在不同客户端计算机上运行的此应用程序的不同实例具有相同的300行加载并且正在随机行上更改数据。应用程序立即在数据库上更新数据。在他们这样做之前,检查完整性,以便在出现问题时用户得到反馈。但是对于用户在屏幕上看到旧值的某些行,他必须在他想确保拥有最新数据时手动重置缓存。

如果应用程序考虑更改的行本身会很好。每隔几秒就会有更新。但只有部分更新与其他应用程序相关(取决于活动过滤器......)

我想到的解决方案:

  1. 使用带有公共缓存的OR-Mapper(例如带有群集缓存的NHibernate)
    • 开放式问题:这些L2缓存是否针对客户端应用程序?缓存更改发生时,我可以触发UI更新吗?其他基于OR-Mapper的解决方案?
  2. 使用应用程序服务器实现另一层,将逻辑移动到此应用程序服务器。仅运行一个实例,该实例缓存数据并在逻辑对象上发送事件,该事件向其他客户端通知更新的数据。不要在客户端上缓存任何数据。
  3. 在逻辑级别添加某种数据更改通知(基于广播的通知......)
    • 开放式问题:现有图书馆?加载SQL Server?
  4. 完全是其他解决方案吗?
  5. 我知道我在这里没有解决方案。只需要对这些解决方案(或新的解决方案)有所了解......感谢任何投入!

3 个答案:

答案 0 :(得分:3)

我想在此分享我的经验。在类似的情况下,所有客户都在一个企业局域网上。我在客户端应用程序中实现了一个UDP客户端(发送器/接收器),每当客户端更新数据时,它就会在Network BroadCast地址上广播“DataRefreshMessage”。所有其他客户端在收到“DataRefreshMessage”时更新了它们的视图。

我知道UDP不可靠,但对我的要求足够可靠,我的解决方案工作得很好。

答案 1 :(得分:1)

我自己没有使用过,但我相信当对以前查询过的数据进行更改时,SQL Server有dependency functionality that can notify your application

我不知道与订阅这些通知的应用程序数量有多大关系。我链接的那个页面上有一条说明,说这种方法并不适合大量客户使用。

答案 2 :(得分:0)

老实说,听起来像是你正在鼹鼠山上建造一座山。如果您只是加载300条记录,只需每隔一段时间重新加载数据库中的数据,而不必担心缓存。数据集非常小,无论如何都会非常快,你不会有额外的复杂性和使用分布式缓存的失败点等等。

如果您需要确保只有一个人写入数据库,并且该人写入最新数据。您可以实现某种数据库锁定表,并在执行此操作之前检查其他人是否正在编写。