【问题标题】:java embedded database w/ ability to store as one filejava嵌入式数据库,能够存储为一个文件
【发布时间】:2010-11-12 17:23:57
【问题描述】:

我需要为一些表格格式的简单数据创建一个存储文件格式,正在尝试使用 HDF5,但由于一些问题几乎放弃了,我想重新检查嵌入式数据库的使用以查看如果它们对我的应用程序来说足够快。

是否有信誉良好的嵌入式 Java 数据库可以选择将数据存储在一个文件中?我知道的唯一一个是 SQLite(可用的 Java 绑定)。我尝试了 H2 和 HSQLDB,但它们似乎开箱即用地创建了多个文件,我非常希望在一个文件中拥有一个数据库。

编辑:相当快的性能很重要。对象存储不是;出于性能考虑,我只需要存储整数和 BLOB。 (+ 一些字符串,但对性能没有影响)

编辑 2: 存储数据效率对于较大的数据集很重要,因此 XML 已淘汰。

【问题讨论】:

  • 您尝试过 Apache Derby/JavaDB 吗?我不知道它是如何在幕后存储数据的,但这是您可以查看的另一件事。
  • Firebird 绝对满足相当快的要求。 :)

标签: java embedded-database


【解决方案1】:

亚硝酸盐数据库http://www.dizitart.org/nitrite-database.html

NOsql Object (NO2 a.k.a Nitrite) 数据库是一个开源的 nosql 用 Java 编写的嵌入式文档存储,带有类似 API 的 MongoDB。它 支持内存中和基于单个文件的持久存储。

【讨论】:

    【解决方案2】:

    如果您使用带有 PAGE_STORE 选项的最新 H2 版本,H2 仅使用一个文件。这是一项新功能,因此可能并不可靠。

    【讨论】:

      【解决方案3】:

      如果您只需要读取权限,那么 H2 可以read the database files from a zip file。

      同样,如果您不需要持久性,则可以使用仅内存版本的 H2。

      如果您需要读/写访问和持久性,那么您可能无法使用标准 SQL 类型的数据库,因为这些数据库几乎都统一地分别维护索引和数据文件。

      【讨论】:

        【解决方案4】:

        有一次我使用了一个将其数据保存到文件的对象数据库。它有一个Java 和一个.NET 接口。你可能想检查一下。它叫做db4o。

        【讨论】:

        • +1: 提到 db4o,因为如果你没有,我会发布它
        【解决方案5】:

        Chronicle Map 是一个嵌入式纯 Java 数据库。

        • 它将数据存储在一个文件中,即。 e.

          ChronicleMap<Integer, String> map = ChronicleMap
              .of(Integer.class, String.class)
              .averageValue("my-value")
              .entries(10_000)
              .createPersistedTo(databaseFile);
          
        • Chronicle Map 已经成熟(几个月来没有报告严重的存储错误,虽然它正在积极使用中)。

        • 独立的基准测试表明,Chronicle Map 是 Java 的 the fastest 和 the most memory efficient 键值存储。

        您的用例的主要缺点是 Chronicle Map 仅支持简单的键值模型,但可以在其之上构建更复杂的解决方案。

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

        【讨论】:

          【解决方案6】:

          如果您正在寻找一个小而快的数据库,可能会与另一个程序一起发布,我会检查 Apache Derby 我不知道您将如何定义嵌入式数据库,但我在一些项目中将其用作调试数据库,可以与源一起签入,并且可在每台开发人员机器上即时使用。

          【讨论】:

          • Apache Derby 现在是 Java DB。因此,它有很好的文档记录和支持,并且可能随您的 IDE 一起提供。
          【解决方案7】:

          这不是 SQL 引擎,但如果您使用 Prevayler 和 XStream,您可以轻松创建包含所有数据的单个 XML 文件。 (Prevayler 称之为快照文件。)

          虽然它不是基于 SQL 的,因此需要一点麻烦,但它自包含的特性使开发(尤其是良好的测试)变得更加容易。此外,它的速度和可靠性令人难以置信。

          【讨论】:

            【解决方案8】:

            您可能想查看jdbm - 我们在多个项目中使用它,而且速度非常快。如果您将它用于 ACID 类型的应用程序,它确实使用 2 个文件(一个数据库文件和一个日志文件),但如果您不需要固体 ACID,您可以直接删除直接数据库访问(无日志文件)。

            JDBM 很容易支持整数和 blob(任何你想要的),而且速度非常快。它并不是真正为并发而设计的,因此如果您有多个线程,则必须自己管理锁定,但如果您正在寻找一个简单、可靠的嵌入式数据库,这是一个不错的选择。

            【讨论】:

            • 一段有趣的历史:Jan Kotek - 后来的 jdbm 贡献者之一,但绝对不是原作者 - 将项目分叉到 mapdb 中,并用它做了一些了不起的工作。 mapdb 甚至不再像 jdbm 那样遥不可及——它在各方面都更好,而且 Jan 继续给人留下深刻印象。值得一试。
            【解决方案9】:

            既然您提到了 sqlite,我假设您不介意本地数据库(只要有良好的 java 绑定可用)。 Firebird 与java配合良好,默认做单文件存储。

            如果您没有单个文件的要求,H2 和 HSQLDB 都是很好的选择。

            【讨论】:

            • 您使用的是 Jaybird 驱动程序吗?
            【解决方案10】:

            我认为现在我将继续使用 HDF5 进行持久数据存储,并结合 H2 或其他一些数据库进行内存索引。我无法让 SQLite 将 BLOB 与我拥有的 Java 驱动程序一起使用,我无法启动并运行嵌入式 Firebird,而且我还不相信 H2 与 PAGE_STORE。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-09-08
              • 2010-10-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-05
              • 2017-12-20
              • 1970-01-01
              相关资源
              最近更新 更多