Java嵌入式数据库,具有将其存储为一个文件的能力

10

我需要为一些简单的表格数据创建一个存储文件格式,尝试使用HDF5但由于一些问题已经几乎放弃了,我想重新审视嵌入式数据库的使用,看看它们是否足够快适用于我的应用程序。

是否有一个信誉良好的嵌入式Java数据库可以将数据存储在一个文件中?我所知道的唯一一个是SQLite(有Java绑定可用)。我尝试过H2和HSQLDB,但开箱即用它们似乎会创建多个文件,而对我来说拥有一个数据库文件非常重要。

编辑:理论上较快的性能很重要。对象存储不是关键点;为了性能问题,我只需要存储整数和BLOBs。(仅一些字符串但没有性能关键)

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


你尝试过Apache Derby/JavaDB吗?我不知道它是如何在幕后存储数据的,但这是另一件你可以考虑的事情。 - Jack Leow
Firebird 绝对满足合理的快速要求。 :) - jsight
请尝试访问 https://github.com/jankotek/MapDB。 - kervin
10个回答

5

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

NOsql Object (NO2 即 Nitrite) 数据库是一款开源的NoSQL嵌入式文档存储,使用Java编写,具有类似MongoDB API。它支持内存和单文件持久存储。


4

如果您使用带有PAGE_STORE选项的最新H2版本,则只需要一个文件即可。这是一个新功能,可能不够稳定。


3
如果您只需要读取访问,则H2可以从zip文件中读取数据库文件。同样,如果您不需要持久性,则可以使用仅内存的H2版本。如果您需要读写访问和持久性,则使用标准SQL类型数据库可能会遇到困难,因为这些数据库几乎都统一地将索引和数据文件分开维护。

2

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

  • It stores data in one file, i. e.

    ChronicleMap<Integer, String> map = ChronicleMap
        .of(Integer.class, String.class)
        .averageValue("my-value")
        .entries(10_000)
        .createPersistedTo(databaseFile);
    
  • Chronicle Map is mature (no severe storage bugs reported for months now, while it's in active use).

  • Idependent benchmarks show that Chronicle Map is the fastest and the most memory efficient key-value store for Java.

您的使用场景的主要缺点是Chronicle Map仅支持简单的键值模型,但是可以在其之上构建更复杂的解决方案。
免责声明:我是Chronicle Map的开发人员。

2

我曾经使用过一种将数据保存到文件的对象数据库。它有Java和.NET接口。你可能想要查看一下。它叫做db4o


1
+1:因为你提到了db4o,如果你没有提到它,我会发帖推荐它的。 - dfa

1
如果您正在寻找一个小型且快速的数据库,可能需要与另一个程序一起发布,我建议您查看Apache Derby。我不知道您如何定义嵌入式数据库,但我在一些项目中使用它作为调试数据库,可以随源代码一起检查,并且在每台开发人员的机器上都可以立即使用。

1
Apache Derby现在被称为Java DB。因此,它有很好的文档支持,并且可能已经随您的IDE一起安装了。 - daveb

1
这并不是一个 SQL 数据库引擎,但如果你使用 Prevayler 结合 XStream,你可以很容易地创建一个单一的 XML 文件来存储所有数据(Prevayler 称之为快照文件)。
虽然它不基于 SQL,所以需要一些额外的努力,但其自包含的特性使得开发(尤其是良好的测试)更加容易。而且,它非常快速和可靠。

1

你可能想要查看jdbm - 我们在几个项目中使用它,速度相当快。如果你将其用于ACID类型的应用程序,则会使用2个文件(一个数据库文件和一个日志文件),但如果不需要坚实的ACID,则可以直接降级到直接数据库访问(无日志文件)。

JDBM可以轻松支持整数和blob(任何你想要的东西),而且速度很快。它并不是为并发而设计的,因此如果有多个线程,你必须自己管理锁定,但如果你正在寻找一个简单、坚实的嵌入式数据库,那么它是一个不错的选择。


有趣的历史小故事:Jan Kotek是jdbm的后期贡献者之一,但绝对不是原始作者。他将该项目分支为mapdb,并在其中做了一些惊人的工作。mapdb现在已经完全不像jdbm了 - 它在各个方面都更好,并且Jan仍然给人留下深刻印象。值得一试。 - Kevin Day

0

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

如果您没有单文件存储的要求,那么H2和HSQLDB都是非常好的选择。


1
你正在使用Jaybird驱动程序吗? - Jason S

0

我想目前我会继续使用HDF5进行持久性数据存储,再与H2或其他数据库结合使用进行内存索引。我无法通过我所拥有的Java驱动程序让SQLite使用BLOBs,我也无法使嵌入式Firebird运行起来,而我也不信任H2的PAGE_STORE。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接