内存中的 Java DB [关闭]

Posted

技术标签:

【中文标题】内存中的 Java DB [关闭]【英文标题】:In-memory Java DB [closed] 【发布时间】:2010-12-28 06:48:23 【问题描述】:

是否有任何 Java 数据库可以在嵌入式模式下运行,其中一些表存储在内存中,同时从磁盘加载其他表? H2 和 JavaDB 似乎是 Java DB 的两个领导者,我知道它们都有内存模式,但是它们是让您将整个 DB 加载到内存中还是您可以逐表决定?

【问题讨论】:

【参考方案1】:

这是HSQL网站中提到的缓存表FAQ。

•HSQLDB 是否将所有数据存储在内存中。结果内存不会用完吗?

•仅当您需要时才将所有数据存储在内存中。默认情况下,CREATE TABLE 生成内存表,因为这是较小表的最佳类型。对于较大的表,请使用 CREATE CACHED TABLE 并调整缓存大小以适应您的内存使用要求(低至 8MB 左右)。请参阅指南的系统管理和部署问题一章。没有简单的规则,也没有强加于 HSQLDB 的部分,因为仅使用几个设置就可以实现最大的灵活性。 HSQLDB 的一个流行用途是用于 OLAP、ETL 和数据挖掘应用程序,在这些应用程序中,巨大的 Java 内存分配用于在内存中保存数百万行数据。

我认为缓存表已经足够强大,可以满足您的需求。

来自http://hsqldb.org/web/hsqlFAQ.html

缓存表和内存表对比

MEMORY 表和 CACHED 表一般用于数据存储。两者的区别如下:

所有 MEMORY 表的数据在数据库启动时从 *.script 文件中读取并存储在内存中。相反,在访问表之前,缓存表的数据不会读入内存。此外,每个 CACHED 表只有部分数据保存在内存中,允许表中的数据多于内存中保存的数据。

当数据库以正常方式关闭时,MEMORY 表的所有数据都会写入磁盘。相比之下,CACHED 表中发生变化的数据在运行期间和关闭时都会被写出。

所有 CACHED 表的数据缓存大小和容量都是可配置的。这使得允许将 CACHED 表中的所有数据缓存在内存中成为可能。在这种情况下,访问速度不错,但比 MEMORY 表稍慢。

对于普通应用程序,建议将 MEMORY 表用于少量数据,将 CACHED 表用于大型数据集。对于速度至关重要且有大量可用内存可用的特殊应用程序,MEMORY 表也可用于大型表。

H2 和 Derby(JavaDB) 似乎还不支持此功能。如果不是事实,请纠正我。

【讨论】:

【参考方案2】:

大多数内存数据库(例如 HSQLDB 能够将部分(或全部)数据缓存到磁盘。通常它的级别足够低,因此对程序员来说是透明的,但肯定是可配置的

【讨论】:

有什么文档可以指点我吗?从我在 H2 网站上看到的情况来看,内存仅在数据库不是持久化的情况下才有效。 你可能想看看兵马俑terracotta.org @DroidIn.net 兵马俑是商业的吗?而且它是一种缓存而不是数据库,对吧? Terracota 肯定不是 db,而且有免费与企业级的产品

以上是关于内存中的 Java DB [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

是否可以反射性地检查 Java 中的内存泄漏? [关闭]

使用内存中的 fake/db 测试 Firebase 数据库

java用哪个数据库在内存中存储数据? [关闭]

使用java在内存中加载2GB [关闭]

在关闭准备好的语句之前在函数中返回值 - 内存泄漏?

比较 Java 内存堆转储:Java 桌面应用程序的内存分析 [关闭]