在内存数据库中

时间:2009-03-07 00:52:27

标签: database nhibernate in-memory in-memory-database

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

注意我只需要选择功能。

4 个答案:

答案 0 :(得分:3)

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

在你走这条路之前一定要确保你必须这样做。首先使您的数据库尽可能高效。现在显然这包括诸如拥有适当的索引和调整数据库之类的东西,但即使把马放在购物车之前。

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

另外,你可能会喜欢NHibernate但ORMs are not always the best choice。例如,在某些极端情况下,手工编写的SQL将会非常优越。

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

为了正确看待这一点,我需要这样做的唯一时间是需要每天执行数百万笔交易的系统。

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

假设你已经完成了上述所有操作并且仍然需要它,那么我觉得你需要的是缓存或网格解决方案。这是overview of Java grid/cluster solutions,但其中许多(例如Coherence,memcached)也适用于.Net。 .Net的另一个选择是Velocity

需要指出并强调NHibernate之类的东西只有在外部更新数据库并且只有一个启用了NHibernate的进程(禁止集群解决方案)时才是一致的。如果两台不同PC上的两个桌面应用程序都使用NHibernate更新同一个数据库,则缓存根本不起作用,因为持久性单元根本不会意识到另一个正在进行的更改。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

Velocity是一个由Microsoft设计的进程外对象缓存服务器,可以完成您想要的任务,尽管目前只有CTP格式。

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

答案 3 :(得分:1)

您可以使用HANA,快递版。您可以download it for free,它在内存中,柱状,并允许进一步的分析功能,如文本分析,地理空间或预测。您还可以使用ODBC,JDBC,node.js hdb库,REST API等访问。