首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.Net持久化大型列表并近乎实时地保持数据最新

.Net持久化大型列表并近乎实时地保持数据最新
EN

Stack Overflow用户
提问于 2011-01-25 01:57:42
回答 3查看 830关注 0票数 0

好的,等等,因为这里有很多层次,尽管可能需要阅读这些内容,但我认为我们所有人得出的答案将对large.With的社区非常有用,他们说,让我来解决这个问题:

我有一个销售订单输入和管理系统的C# .Net桌面应用程序(Windows Forms,但我想它也很容易成为WPF )。我遇到的问题是,我需要在应用程序中使用的最重要的数据列表之一相当大(大约15k条记录,而且还在不断增加),并且在不断变化,我希望使该列表在内存中与数据库保持同步,而不是每隔2秒轮询数据库一次。应用程序也不是单实例的,因此应用程序所需的所有这些列表都会从数据库放入内存中,并在每个实例中保存一次。

好了,现在你可以看到困境了,让我们看看我们是否能想出一个解决方案。

我的想法是:

如果我们能够使用.NET 4.0 (我可以),我认为在内存中只保留一组数据的答案是使用内存映射文件。虽然从表面上看,这似乎是一场全垒打,但它的管理要复杂得多,而且可能是过度杀伤力。有什么想法?

为了将数据库中的数据负载保持在最低限度,我正在考虑将各种列表持久存储到用户PC上某个特殊文件夹中的XML文本文件中,然后是一个最终的XML文件,用于跟踪XML文件及其日期。在应用程序启动时,只需执行一次对DB的调用,即可获得表/列表的列表以及每个表/列表的“最后更新日期”。对于具有相同上次更新日期的每个XML文件,我可以从XML文件加载,而不是查询数据库。对于过期的列表,我可以查询自我拥有的日期以来的更改,然后加载XML文件,然后提交更改。这样,我需要等待的唯一更改很可能是来自更频繁更新的列表的更改,而不是所有的表/列表。好吧,我承认我不是最擅长解释的人,但我认为你应该能够想象出来。

至于保持实时更新,我在考虑让插入和更新触发器(不会发生删除)调用然后调用的SP,这就是我有点模糊的地方,以某种方式将插入/更新的信息传递给应用程序订阅的WCF服务,并通过WCF回调将更新推送到客户端。现在我认为这应该都可以工作,但是,例如,这不会导致应用程序的3个实例尝试同时更新内存中的相同更改吗?WCF服务是否能够将更新仅发送到每个客户端PC的一个实例;它是否可以区分?

提前感谢您对此的任何想法、意见和投入。我将保留至少48小时的“奖励”答案,因为我希望每个人都有机会投入自己的2美分,让这个帖子在未来变得更有用……

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-25 04:27:38

要做到这一点,有一种方法,也许是最好的方法,就是写日志。

要实现这一点,请将一个日志表与一个需要在每个客户端上保持更新的数据库表关联起来。这个表的主键是一个时间戳。每当任何客户端更新或插入(比方说) customer表中的行时,它还会向日志表中添加一行,指示已添加或更新的客户的主键。

然后,每个客户端都可以通过查询日志表,找到主键大于或等于客户端上次查询(客户端跟踪的)时间戳的所有行,从而找到更改列表。对customer表的简单连接将获得所有新行和更新后的行。然后,客户端将这些行合并到其customer表的本地副本中。

你说你不想每隔2秒就访问一次数据库。关于这一点的三个想法。

首先,它应该足够简单,以建立原型,并确定是否每2秒访问数据库一次实际上是您需要解决的问题。

秒:每2秒?在我看来,这是由对魔法的信念驱动的需求,而不是实际的业务需求。如果它是由业务需求驱动的,它会让我担心更深层次的问题,比如:假设用户执行涉及客户的事务的时间超过2秒,如果客户行在事务过程中发生变化会发生什么?

最后:即使您最终确实需要实现广播模型,广播的起点也将是需要发送给客户端的项目的工作队列。写日志是一个很好的起点。

Protip:不要忘记实现从日志表中清除旧条目的当天结束流程。

票数 1
EN

Stack Overflow用户

发布于 2011-01-25 02:05:31

我看不出在内存中保存数据库有什么好处。数据库的意义在于成为一个数据库。

您必须在应用程序中重新生成多用户数据库功能。

这似乎是一个不可能成功的提议。把这个问题留给微软吧。而是创建一个使用sql server所有功能的n层应用程序。然后,当你有一个工作的测试版时,寻找应用程序中速度较慢的部分,并从那里移动。

票数 5
EN

Stack Overflow用户

发布于 2011-01-25 02:31:46

我在我的程序中有类似的需求,但我的解决方案是构建类,这些类延迟地加载数据库对象(在需要时),甚至部分加载一些更重要、更大的项(一开始只是主键和名称)。然后,每当我正在查看的数据库项未初始化(只有PK和name)或仍然为空时,我就会转到数据库,急切地加载该对象和其他几个同类对象。

如果你有一个包含15k个项目的UI元素,那么你的程序将无法被人类使用(最好什么都不显示,只把它保存在一个列表中)。您应该考虑使用搜索对话框或类似的工具。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4785328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档