哪个用Java编写的嵌入式数据库用于简单的键/值存储?

我最近问过一个关于Neo4j的问题,我开始工作,看起来不错。 它是嵌入式的,它是用Java编写的,并没有(太多)依赖项。

然而,这是一个图形数据库,我不知道将它用作简单的键/值存储是否是一个好主意。

基本上我有一张大地图,在Java中看起来像这样:

Map<Integer,Map> 

我在主地图中有几千万个条目,每个条目都包含一个属性/值的映射。 “内部”地图相对较小:约20个条目。

我需要一种方法来保持从运行webapp到另一个的映射。

使用Neo4j,我所做的是为每个ID(整数)创建一个节点,然后为内部映射中的每个条目放置一个属性。 从我早期的测试看起来似乎有效,但我不确定这是一个很好的方法。

用Java编写的哪个可嵌入数据库会用到吗?

要求是:

  • 用Java编写

  • 可嵌入(所以没有太大)

  • 不是 SQL(*)

  • 开源

  • 易于备份(我需要能够在服务器运行时进行“实时”备份)

我的术语也可能有点不对,所以请随时帮助我/纠正我。 对于我的“地图地图”,最合适的是键/值对DB吗?

由于键/值对DB,文档DB,大表,图形DB等之间的区别,我有点迷失。

我也很喜欢使用像Neo4J这样的图形数据库来满足我的需求(我认为性能确实不会是一个问题,因为我会看到相对少量的条目)。

当然我可以自己坚持我的地图地图,但我真的不想在这里重新发明任何轮子。 我想重用一个久经考验的DB ……

(*)我不想要SQL的原因是我总是会有这个“地图图”,内部地图会不断发展,所以我不想要太结构化的东西。

Google的LevelDB似乎有几个端口进入Java:

  • Dain LevelDB端口(纯Java)
  • Dain LevelDB(JNI)

然后这里有一整套嵌入式Java数据库:

  • 嵌入式java数据库
  • Java嵌入式数据库比较

对于您的用例,我建议使用MapDBhttp://www.mapdb.org

它符合您的要求:

  • 用Java编写
  • embeddable – 没有依赖的单一jar
  • 不是SQL – 为您提供持久保存到磁盘的映射
  • 开源(Apache 2许可证)
  • 易于备份(少量文件)

并具有其他很好的function,如事务,并发和性能。

Chronicle-Map是这个领域的新手。

  • 它是堆外驻留的(具有通过内存映射文件持久保存到磁盘的能力) Map实现
  • 超快 – 每秒支持数百万次查询/更新,即每个查询平均具有亚微秒延迟
  • 支持并发更新(假设是ConcurrentHashMap替换)
  • 您提到的属性映射的特殊支持,如果在集合中修复了属性集 – 允许更新值的特定属性,而无需对整个值进行任何序列化/反序列化(20个字段)。 此function在Chronicle / Lang项目中称为数据值生成
  • 还有很多…

你可以看看伯克利数据库

http://docs.oracle.com/cd/E17277_02/html/GettingStartedGuide/index.html

处理大量数据及其关键/价值非常有效。 我不能真正讲述它,因为我自己发现它,但如果你有时间去研究它…

可以坚持使用XML或JSON文件。 这些都不需要架构,并且在磁盘和内存之间来回相当容易,特别是如果性能真的无关紧要。 (例如,你只是偶尔加载配置)

优点是XML和JSON都非常简单,并且很好地处理了Maps。

您的应用程序依赖负载也要轻得多。 如果您只需要持久化/取消持久化大数据结构,并且不使用大多数嵌入式解决方案将添加的任何查询或类似function,那么整个嵌入式DB类型系统非常繁重。

为了满足您的需求,它大部分内置于Java中,易于备份,因为它只是一个文件,高度嵌入,非常开源,而不是SQL。 XML有时可能有点冗长和笨拙,但它是一个众所周知的域,并且具有非常丰富的工具,以便您可以根据需要在应用程序外部处理它。

迟到的部分,但你可以使用Tayzgrid。 它的开源和进程内缓存可以嵌入到您的应用程序中。 它基本上是In Memory Data Grid或In Memory Key值存储,但它也具有您想要的function,即成为一个简单的进程中嵌入式键值存储。

结帐www.jsondb.io

这是一个纯java,可嵌入的轻量级数据库,它将数据存储为文件,便于备份