2

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

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

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

我想到的解决方案:

  1. 使用带有公共缓存的 OR-Mapper(例如带有集群缓存的 NHibernate)
    • 开放式问题:这些 L2 缓存是为客户端应用程序设计的吗?当缓存更改发生时,我可以触发 UI 更新吗?其他基于 OR-Mapper 的解决方案?
  2. 使用应用服务器实现另一层,将逻辑移至该应用服务器。只运行一个实例,它缓存数据并在逻辑对象上发送事件,通知其他客户端更新的数据。不要在客户端缓存任何数据。
  3. 在逻辑级别添加某种数据更改通知(基于广播的通知...)
    • 开放式问题:现有库?在 SQL Server 上加载?
  4. 完全其他解决方案?

我知道我在这里没有得到解决方案。只需要对这些解决方案(或新解决方案)的一些想法......感谢您的任何投入!

4

3 回答 3

3

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

我知道 UDP 不可靠,但对于我的要求来说足够可靠,而且我的解决方案运行良好。

于 2011-11-14T19:19:20.727 回答
1

我自己没有使用过这个,但我相信 SQL Server 具有依赖项功能,可以在对先前查询的数据进行更改时通知您的应用程序。

不过,我不知道这与订阅这些通知的应用程序数量的比例如何。我链接的那个页面上有一条注释说这种方法不是为大量客户使用而设计的。

于 2011-11-14T18:25:08.990 回答
0

老实说,在我看来,你是在用鼹鼠山造山。如果您只是加载 300 条记录,只需经常从数据库中重新加载数据,而不必担心缓存。数据集是如此之小,无论如何它都会非常快,并且您不会遇到使用分布式缓存等额外的复杂性和故障点。

如果您需要确保只有一个人写入数据库,以及该人何时写入最新数据。您可以实现某种数据库锁定表,并在您这样做之前检查其他人是否正在编写。

于 2011-11-14T17:36:13.730 回答