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

时间:2012-03-19 14:32:06

标签: java database web-applications nosql embedded-database

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

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

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

Map<Integer,Map<String,String>>

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

我需要一种方法来保存从运行webapp到另一个的地图。

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

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

要求是:

  • 用Java编写

  • embeddable(所以没什么太大)

  • SQL(*)

  • 开源

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

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

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

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

当然我可能只是自己坚持我的地图地图,但我真的不想在这里重新发明任何轮子。我想重用一个久经考验的数据库...

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

7 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:13)

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

符合您的要求:

  • 用Java编写
  • embeddable - 没有依赖的单个jar
  • not SQL - 为您提供持久保存到磁盘的地图
  • 开源(Apache 2许可证)
  • 易于备份(少量文件)

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

答案 2 :(得分:8)

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

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

答案 3 :(得分:5)

您可以查看berkeley DB

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

处理大量数据及其关键/价值非常有效。 因为我自己发现它,但是如果你有时间去研究它,我真的无法说出更多的信息.​​.....

答案 4 :(得分:2)

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

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

您的应用程序依赖负载也要轻得多。如果您只是在需要时不保留大型数据结构而不使用大多数嵌入式解决方案将添加的任何查询或类似功能,那么整个嵌入式DB类型系统非常繁重。

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

答案 5 :(得分:2)

部分后期但您可以使用Tayzgrid。它的开源和进程内缓存可以嵌入到您的应用程序中。它基本上是一个内存数据网格或In Memory Key value store,但它也有你想要的功能,即成为一个简单的进程中嵌入式键值存储。

答案 6 :(得分:2)

结帐www.jsondb.io

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