我正在使用 SqlServer 来驱动 WPF 应用程序,我当前正在使用 NHibernate 并预读取所有数据,以便出于性能原因对其进行缓存。这适用于单个客户端应用程序,但我想知道是否有一个可以使用的内存数据库,以便我可以在同一台计算机上的多个应用程序之间共享信息。理想情况下,这将位于我的 NHibernate 堆栈下方,因此我的代码不必更改。实际上,我希望将服务器上的数据库从传统格式移至客户端上的内存数据库。
注意我只需要选择功能。
最佳答案
如果您甚至需要将所有信息加载到内存中,我会感到非常惊讶。我这样说是因为,作为一个例子,我目前正在开发一个 Web 应用程序,该应用程序(由于各种原因)在许多页面上加载数千条记录。这就是PHP+MySQL。即使如此,它也可以做到这一点,并在 100 毫秒以下的时间内渲染页面。
在您走这条路之前,请确保您必须这么做。首先使您的数据库尽可能高性能。现在显然这包括拥有适当的索引和调整数据库之类的事情,但即使是本末倒置。
首先,您需要确保拥有良好的关系数据模型:适合高性能查询的模型。这既是艺术,也是科学。
此外,您可能喜欢 NHibernate,但是 ORMs are not always the best choice 。例如,在某些特殊情况下,手工编码的 SQL 会表现得更加出色。
现在假设您有一个良好的数据模型,并优化了索引和数据库参数,然后正确配置了 NHibernate,那么您才应该考虑将数据存储在内存中当且仅当性能仍然是一个问题。
从长远来看,我唯一需要执行此操作的时间是在每天需要执行数百万个事务的系统上。
避免内存缓存的一个原因是它增加了很多复杂性。您必须处理缓存过期、对底层数据存储的独立更新、是否使用同步或异步更新、如何为客户端提供一致(如果不是最新)的数据 View 、如何处理等问题具有故障转移和复制等功能。需要付出巨大的复杂性成本。
假设您已完成上述所有操作并且仍然需要它,那么在我看来您需要的是缓存或网格解决方案。这是一个overview of Java grid/cluster solutions但其中许多(例如 Coherence、memcached)也适用于 .Net。 .Net 的另一个选择是 Velocity .
需要指出并强调的是,像 NHibernate 这样的东西只有在没有任何外部更新数据库的情况下才具有一致性,并且只有一个支持 NHibernate 的进程(除非是集群解决方案)。如果两台不同 PC 上的两个桌面应用程序都使用 NHibernate 更新同一数据库,则缓 stub 本无法工作,因为持久性单元根本不会知道对方所做的更改。
关于database - 内存数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/621047/