【问题标题】:java embedded library on-disk key-value database [closed]java嵌入式库磁盘键值数据库[关闭]
【发布时间】:2014-04-06 19:51:40
【问题描述】:

认为我正在寻找的是一个无 SQL、库嵌入、在磁盘上(即不在内存中)的数据库,可以从 java 访问(最好在我的实例中运行) JVM)。这并不是一个真正的数据库,我很想自己动手。基本上我正在寻找数据库的“我们应该将其保存在内存中还是将其放在磁盘上”部分。

我们的模型已增长到数 GB。现在这一切都是在内存中完成的,这意味着我们正在将 JVM 推向数 GB 以上。它目前全部存储在一个平面 XML 文件中,使用 xstream 进行序列化和反序列化,并使用 Java'a 内置 gzip 库进行压缩。当我们的模型保持在 100MB 以下时,这很有效,但现在它比这更大,它成为一个问题。

简单地说,模型可以分解为

  • 项目
    1. 配置组件(有向无环图),对数据库完全不友好
    2. 十几个“实验”结构的列表
      • 每个都包含大约十几个“运行模型”结构的列表。
        1. 每个运行模型包含数百兆的数据。一旦写入,它们就永远不会被编辑。

我想做的是有一些符合地图接口的东西,guid -> run-model。这个迷你数据库将保留这些对象的平面表。在我们的实验模型中,我们将用 guid 列表替换运行模型列表,并在应用程序层添加对该映射的 get 调用,这会将其从磁盘中提取到内存中。

这意味着我们可以在 XML 中保留我们的程序配置(我对此非常满意),并在 DBMS 中保留一个大数据表,这将防止我们消耗数 GB 的内存。在程序启动和退出时,我可以从归档格式加载和卸载模型的两个部分(XML 中的配置部分和数据库格式的运行模型)。

我对此感到很兴奋,并认为我可能可以使用 X-Stream 的一些 XML 检查策略和自定义地图实现来实现它,但我脑海中的声音是告诉我我应该找一个图书馆来代替。

我应该自己推出还是有一个足够小的数据库来满足这个要求?

谢谢大家,

-杰夫

【问题讨论】:

  • 我正在开发一个 nosql 数据库,它的 jsndb (sourceforge.net/projects/jsdbase)。 “它处于 alpha 阶段”并且它不是键/值,但您可以通过键获取对象。试一试
  • 感谢您提出这个问题,尽管它已关闭。我也在使用纯文本键值存储,目前正在滚动我自己的存储,但还没有找到一种进行连接的好方法。

标签: java database performance nosql embedded-database


【解决方案1】:

【讨论】:

  • 非常感谢 MapDB。我正在考虑针对 BerkeleyDB 进行部署,但看起来这需要比我想做的更多的配置。事实上,我可以用大约 50 行代码启动、写入、读取和关闭 MapDB,这太棒了。我有点担心 MapDB 目前的发布状态,但对于我们的目的来说,它似乎足够稳定。
  • 不幸的是 MapDB 既不稳定也不成熟。至少在版本 1 中,请参阅更新日志,并确认已关闭但未解决的错误。我真的希望 MapDB 将在 2 年内成为可行的候选者。
  • 自从上次发表评论以来,我们已经在 mapDB 1.0 版上发布了我们的软件 1.0 版,我已经与 MapDB 的作者 Jan Kotek 进行了交谈。我们没有遇到任何由 MapDB 直接引起的问题,尽管有许多已确认的错误。我会鼓励任何阅读这篇文章的人来看看它。
【解决方案2】:

由于 MapDB 可能是解决您的问题的方法,因此 Chronicle Map 也值得考虑。它是一个可嵌入的 Java 键值存储,可选择持久化,提供与 MapDB 非常相似的编程模型:它还通过 vanilla java.util.Map 接口和键和值的透明序列化。

主要区别在于根据第三方基准,Chronicle Map is times faster than MapDB

在稳定性方面,Chronicle Map 数据存储几个月来没有报告任何错误,但它已在许多项目中积极使用。

免责声明:我是 Chronicle Map 的开发者。

【讨论】:

猜你喜欢
  • 2011-10-16
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 2017-03-05
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多