C# 实例化类并从数据库加载数据的最佳实践

C# 实例化类并从数据库加载数据的最佳实践,c#,wpf,oracle,mvvm,C#,Wpf,Oracle,Mvvm,我正在构建一个WPF应用程序(使用MVVM),它最基本的功能是允许用户与Oracle数据库交互 其目的是,它是一个多用户应用程序,因此我需要尽可能与数据库保持同步 最初的想法是拥有一个“repository”类的单一应用程序范围实例,该类将定期从数据库更新其数据,然后在更新发生时通知(使用MvvmLight.Messaging) 第一个问题;这是一个明智的方法,还是有更好的方法来实现这一点 第二个问题,如果第一个问题是合理的,那么定期启动一个方法(在后台线程中)来更新这个“存储库”类的最佳方式是

我正在构建一个WPF应用程序(使用MVVM),它最基本的功能是允许用户与Oracle数据库交互

其目的是,它是一个多用户应用程序,因此我需要尽可能与数据库保持同步

最初的想法是拥有一个“repository”类的单一应用程序范围实例,该类将定期从数据库更新其数据,然后在更新发生时通知(使用MvvmLight.Messaging)

第一个问题;这是一个明智的方法,还是有更好的方法来实现这一点


第二个问题,如果第一个问题是合理的,那么定期启动一个方法(在后台线程中)来更新这个“存储库”类的最佳方式是什么?

听起来您正在创建一个内存缓存(您的存储库),与数据库上的数据相比,它可能已经过时(否则您就不必“定期更新”)缓存中的数据)。这意味着数据库上的数据不是静态的,可能会随着时间的推移而变化。如果您的用户还需要更新此数据,则此缓存将无法工作,因为您的用户将尝试更新已过期的数据

当数据相当静态时,缓存是可以的,否则最好转到原始数据源——数据库本身


一个设计良好的Oracle数据库应该能够轻松处理多个并发用户;很可能您的缓存(除非您真的知道自己在做什么)不会这样做。

更常见的方法是推送更改通知

信号员是这方面的优秀候选人

通常的模式是:

所有数据库更新都通过应用程序服务器层进行

每个客户机都会登记对其上的所有数据或数据子集的兴趣

通过该服务器的调用将导致Signal向所有“感兴趣”的客户端发送新数据

另一种选择是:

通过应用服务器或RabbitMQ等机制调用更新。这将“分割”信号,以便更新进入数据库和redis缓存或内存数据库

客户端轮询缓存

这样做的好处是可以减少数据库服务器上的负载

三种是多种变体

例如,您可能有一个在中国、美国和欧洲使用的应用程序。一个数据库服务器保存所有内容。也许每个区域只对自己区域的数据“感兴趣”。 您可以为每个区域提供一个本地应用服务器,并跨多台本地计算机提供redis缓存

然后,每个区域都是半独立的。你可以为每一个应用一个队列机制,缓存更改,然后如果你与中国的连接中断半小时,你的中国办公室仍然可以工作

这一切是否值得,只有你知道

也许你有很多用户

也许你需要在几秒钟而不是几分钟内了解变化

几年前我在机场系统工作

IIRC预期上限约为3000个并发用户


这只是使用了轮询。

感谢您的合理逻辑。经过一夜的思考,我倾向于得出同样的结论。内存缓存似乎比它的价值更复杂。另外,在与我的PL/SQL同事讨论之后,他们指出,这些数据最终可能会有上万行,因此随着时间的推移,随着记录的增加,加载性能只会越来越差。