【发布时间】:2011-01-24 17:57:42
【问题描述】:
好的,请稍等,因为这有很多层次,尽管阅读所有这些内容可能需要一些时间,但我认为我们所有人提出的答案将对整个社区非常有用。话虽如此,让我设置问题:
我有一个 C# .Net 桌面应用程序(Windows 窗体,但我认为它也可以是 WPF),它是一个销售订单输入和管理系统。我遇到的问题是我需要在应用程序中使用的最重要的数据列表之一相当大(大约 15k 条记录,并且还在增长)并且不断变化,我想保留列表内存与数据库同步,而不是每 2 秒或其他时间轮询数据库。该应用程序也不是单实例,因此应用程序需要的所有这些列表都从数据库中带入内存,并在每个实例中保存一次。
好的,既然你已经看到了困境,让我们看看我们是否能想出一个解决方案。
我的想法:
如果我们能够使用 .NET 4.0(我可以),我认为在内存中只保留一组数据的答案是使用内存映射文件。虽然从表面上看是本垒打,但管理起来要复杂得多,而且可能有点矫枉过正。想法?
为了将数据库中的数据负载保持在最低限度,我正在考虑将各种列表保存到用户 PC 上某个特殊文件夹中的 XML 文本文件中,然后使用一个最终的 XML 文件来跟踪 XML 文件和他们的日期。在应用程序启动时,执行对数据库的单个调用,获取表/列表的列表以及每个的“最后更新日期”。对于具有相同上次更新日期的每个 XML 文件,我可以从 XML 文件加载而不是查询数据库。至于过期的列表,我可以查询自拥有日期以来的更改,然后加载 XML 文件,然后提交更改。这样,我不得不等待的唯一更改很可能是来自更频繁更新的列表的更改,而不是所有表/列表。好吧,我承认我不是最擅长解释事物,但我认为您应该能够将其形象化。
至于实时保持最新状态,我正在考虑使用插入和更新触发器(不会发生删除)来调用 SP,这就是我有点模糊的地方,以某种方式传递插入的/updated 信息到应用程序订阅的 WCF 服务,并通过 WCF 回调将更新推送到客户端。现在我认为这应该一切正常,但是,例如,这不会导致应用程序的 3 个实例同时更新内存中的相同变化吗? WCF 服务是否只能将更新发送到每台客户端 PC 的一个实例?能区分吗?
提前感谢您对此提出的任何想法、意见和意见。我将保留“奖励”一个答案至少 48 小时,因为我想让每个人都有机会投入 2 美分,让这个线程对未来更有用...
【问题讨论】:
-
缓存在你的 wcf 服务层吗?
-
请告诉我“15k”和“ComboBox”是不同的东西。
-
您应该能够使用 WCF 的 net-tcp 绑定让服务器向连接的客户端推送有关表更新的更改通知,这至少可以解决您的轮询问题。应用程序的不同实例应该有自己的内存中数据副本和自己的 WCF 连接,因此在您尝试持久化之前应该没问题。
-
@Tridus - 我会看看你在说什么,但假设我有几个列表,15k 一个是最大的,但其他的更短但有 mor 列。当用户还打开了 Outlook 和其他一些东西时,拥有 3 到 4 个实例,每个实例都有自己的集合,不会很容易使只有 2 或 3 GB 内存的 PC 拥塞吗?
-
@Wonko the Sane - 更多地将其视为自动完成而不是 DropDownList。用户键入大部分名称或 id,如果内置自动完成逻辑未找到匹配项,则代码隐藏会进行匹配...另外,请记住数据绑定是虚拟化的。