2

我正在使用 SqlServer 来驱动 WPF 应用程序,我目前正在使用 NHibernate 并预读取所有数据,因此出于性能原因将其缓存。这适用于单个客户端应用程序,但我想知道是否有一个内存数据库可供我使用,以便我可以在同一台机器上的多个应用程序之间共享信息。理想情况下,这将位于我的 NHibernate 堆栈之下,因此我的代码不必更改。实际上,我希望将我的数据库从服务器上的传统格式移动到客户端上的内存数据库。

注意我只需要选择功能。

4

4 回答 4

3

如果您甚至需要将所有信息加载到内存中,我会感到非常惊讶。我这样说是因为,作为一个例子,我目前正在开发一个 Web 应用程序(由于各种原因)在许多页面上加载数千条记录。这是 PHP + MySQL。即便如此,它也可以在 100 毫秒内完成并渲染页面。

在您沿着这条路线走之前,请确保您必须这样做。首先使您的数据库尽可能高性能。现在显然这包括诸如拥有适当的索引和调整数据库之类的事情,但即使是本末倒置。

首先,您需要确保您拥有一个良好的关系数据模型:一个适合高性能查询的模型。这既是艺术,也是科学。

此外,您可能喜欢 NHibernate,但ORM 并不总是最佳选择。例如,在某些极端情况下,手工编码的 SQL 将非常出色。

现在假设您有一个良好的数据模型,并假设您已经优化了索引和数据库参数,然后您已经正确配置了 NHibernate,那么当且仅当性能仍然是一个问题时,您才应该考虑将数据存储在内存中。

从这个角度来看,我需要这样做的唯一时间是在需要每天执行数百万笔交易的系统上。

避免内存缓存的一个原因是它增加了很多复杂性。您必须处理缓存到期、对底层数据存储的独立更新、使用同步还是异步更新、如何为客户端提供一致的(如果不是最新的)数据视图、如何处理等问题具有故障转移和复制等功能。需要付出巨大的复杂性成本。

假设您已完成上述所有操作并且仍然需要它,那么在我看来,您需要的是缓存或网格解决方案。以下是Java 网格/集群解决方案的概述,但其中许多(例如 Coherence、memcached)也适用于 .Net。.Net 的另一个选择是Velocity

需要指出并强调的是,像 NHibernate 这样的东西只有在没有任何外部更新数据库的情况下是一致的,并且只有一个启用 NHibernate 的进程(除非是集群解决方案)。如果两台不同 PC 上的两个桌面应用程序都使用 NHibernate 更新同一个数据库,那么缓存将无法正常工作,因为持久性单元根本不会知道另一个正在进行的更改。

于 2009-03-07T01:22:07.363 回答
1

http://www.db4o.com/可以成为你的朋友!

于 2009-03-07T00:56:04.260 回答
1

Velocity是由 Microsoft 设计的进程外对象缓存服务器,尽管目前它只是 CTP 形式,但它几乎可以满足您的需求。

我相信memcached也有包装器,也可以用来缓存对象。

于 2009-03-07T01:20:33.297 回答
1

您可以使用HANA,快递版。您可以免费下载它,它是内存中的、柱状的,并允许进一步的分析功能,例如文本分析、地理空间或预测。您还可以使用 ODBC、JDBC、node.js hdb 库、REST API 等进行访问。

于 2017-05-10T16:35:24.510 回答