C# 网络范围的数据同步

C# 网络范围的数据同步,c#,nhibernate,architecture,appserver,C#,Nhibernate,Architecture,Appserver,我们开发了一个运行在MS SQL Server上的C#WinForms应用程序。直到今天,我们都在使用一个非常简单的自制OR映射器(使用反射),它带有一个用单例模式实现的廉价缓存机制。有一个用户触发的“重置”功能。该体系结构是一个简单的两层(客户机、服务器)三层(客户机上的表示和逻辑,服务器上的MS SQL作为数据层) 通常,我们加载大约300行和大约30列,这些行和列经常发生变化(其他一些表很少发生变化)。此应用程序的不同实例在不同的客户端计算机上运行,并且加载了相同的300行,并且在随机行上

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

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

如果应用程序考虑更改的行本身,那就太好了。每隔几秒钟就会有更新。但只有部分更新与其他应用程序相关(取决于有源滤波器…)

我心目中的解决办法:

  • 使用具有公共缓存的或映射器(例如,具有群集缓存的NHibernate)
    • 开放性问题:这些L2缓存是为客户端应用程序设计的吗?当缓存发生更改时,是否可以触发UI更新?其他或基于Mapper的解决方案
  • 使用应用服务器实现另一层,将逻辑移动到此应用服务器。仅运行一个实例,该实例缓存数据并发送逻辑对象上的事件,该事件将更新的数据通知其他客户端。不要缓存客户端上的任何数据。
    • 开放性问题:在应用服务器上加载?与应用服务器的开销通信?将逻辑DLL移动到应用程序服务器中的工作量。。?报告的数据源(直接/应用服务器)
    • 类似于此用户认为:
  • 在逻辑级别添加某种类型的数据更改通知(基于广播的通知…)
    • 开放性问题:现有图书馆?是否在SQL Server上加载
  • 完全其他解决方案

  • 我知道我这里没有解决办法。只是需要一些关于这些解决方案(或新方案)的想法。。。谢谢你的意见

    老实说,在我看来,你好像是在小题大做。如果只是加载300条记录,只需每隔一段时间从数据库中重新加载数据,而不必进行缓存。数据集非常小,无论如何都会非常快,而且您不会因为使用分布式缓存而增加复杂性和故障点


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

    我自己没有使用过此功能,但我相信当对以前查询的数据进行更改时,SQL Server会这样做


    不过,我不知道这与订阅这些通知的应用程序的数量有多大的关系。我链接的那页上有一条说明,说这种方法不是为大量客户设计的。

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


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

    好的,我忘了一件事:用户网格上显示了300行,但这些是实际数据集的分组视图。实际数据集可以是记录数的百分之几到千分之几。。。另外,当我更新整个数据集时,比如说每5秒钟,客户机本身就非常忙于重新绘制网格之类的事情。我希望在行级别进行更改…嗯,我刚刚看到SELECT语句在使用此功能时只能使用SQL语法的一个子集。。。虽然可能对我有用,但我们将看到:-)我们在同一场景中使用了Tibco Rendezvous,这在性能上很好,消除了对特定网络协议的依赖,并且即使使用UDP也能提供可靠的传输。