【问题标题】:File backed Java map文件支持的 Java 映射
【发布时间】:2013-07-06 21:18:18
【问题描述】:

有没有一种简单的方法来获得文件支持的地图?

地图的内容会定期更新,有的被删除,也有的被添加。为了保证地图中的数据安全,需要持久性。我知道数据库是理想的,但遗憾的是,由于限制,无法使用数据库。

我试过了:

每次更新时将地图的全部内容写入文件。这行得通,但显然有一个缺点,即每次都重写整个文件,映射的内容预计从几个条目到 ~2000 不等。还有一些并发问题(即乱写会导致数据丢失)。

使用RandomAccessFile 并保留指向每个文件起始字节的指针,以便可以使用 seek() 查找每个条目。同样,这与以前有类似的问题,更改条目将涉及更新其后的所有引用。

理想情况下,该解决方案将涉及某种缓存,以便仅将最近访问的条目保留在内存中。

有这种事吗?还是可以通过第三方 jar 获得?有人建议使用 Oracle Coherence,但我似乎找不到太多关于如何实现它的信息,这似乎有点像用大锤敲碎坚果。

【问题讨论】:

  • 也许您可以改用H2 Database?它是一个纯 Java 数据库。它可以驻留在内存中,也可以写入磁盘到单个文件中。

标签: java oracle-coherence randomaccessfile


【解决方案1】:

您可以查看MapDB,它是为此目的而创建的。

MapDB 提供由磁盘存储支持的并发 Maps、Sets 和 Queues 或堆外内存。它是一种快速且易于使用的嵌入式 Java 数据库引擎。

【讨论】:

  • 看了一下,好像是上面提到的JDBM的一个fork,对吗?无论哪种方式,它看起来都更适用。
  • 据我所知,JDBM4 已重命名为 MapDB(参见 kotek.net/blog/JDBM4_renamed_to_MapDB)。 googlecode repo 对我来说似乎被遗弃了。
【解决方案2】:

是的,Oracle Coherence 可以完成所有这些工作,但如果您只做这些,可能就有点过头了。

一种方法是从 RAM“溢出”到磁盘:

    BinaryStore diskstore = new BerkeleyDBBinaryStore("mydb", ...);
    SimpleSerializationMap mapDisk = SimpleSerializationMap(diskstore);
    LocalCache mapRAM = new LocalCache(100 * 1024 * 1024); // 100MB in RAM
    OverflowMap cache = new OverflowMap(mapRAM, mapDisk);

从 3.7 版开始,您还可以透明地从 RAM 日志溢出到闪存日志。虽然您可以在代码中配置它(如上所述),但它通常只是一两行配置,然后您要求代表您配置缓存,例如

    // simplest example; you'd probably use a builder pattern or a configurable cache factory
    NamedCache cache = CacheFactory.getCache("mycache");

有关详细信息,请参阅http://coherence.oracle.com/ 提供的文档

为了全面披露,我在 Oracle 工作。这篇文章中表达的观点和观点是我自己的,并不一定反映我雇主的观点或观点。

【讨论】:

    【解决方案3】:

    jdbm2 看起来很有前途,从未使用过,但它似乎可以满足您的要求:

    JDBM2 提供了由磁盘存储支持的 HashMap 和 TreeMap。这是持久化数据的一种非常简单快捷的方法。 JDBM2 对硬件的要求也最低,并且高度可嵌入(jar 只有 145 KB)。

    如果您寻找键/值存储,您会发现更多解决方案。

    【讨论】:

    • 干杯,我会看看。它确实看起来像我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2015-11-15
    • 1970-01-01
    相关资源
    最近更新 更多