基于文件的Java映射

基于文件的Java映射,java,oracle-coherence,randomaccessfile,Java,Oracle Coherence,Randomaccessfile,有没有一种简单的方法来创建文件备份的映射 地图的内容定期更新,有些被删除,有些被添加。为了保证映射中的数据安全,需要持久性。我知道数据库是理想的,但遗憾的是,由于限制,数据库无法使用 我试过: 每次更新地图时,将地图的全部内容写入文件。这是可行的,但显然有一个缺点,即每次都会重写整个文件,映射的内容可能在从几个条目到~2000个条目之间的任何位置。还存在一些并发问题(即,无序写入会导致数据丢失) 使用并保留指向每个文件开始字节的指针,以便可以使用seek()查找每个条目。同样,这与之前的问题类似

有没有一种简单的方法来创建文件备份的映射

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

我试过:

每次更新地图时,将地图的全部内容写入文件。这是可行的,但显然有一个缺点,即每次都会重写整个文件,映射的内容可能在从几个条目到~2000个条目之间的任何位置。还存在一些并发问题(即,无序写入会导致数据丢失)

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

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

有这样的事吗?或者通过第三方jar提供?有人建议使用Oracle Coherence,但我似乎找不到太多关于如何实现这一点的信息,这似乎有点像是用大锤敲开螺母。

你可以看看哪个是为了这个目的而创建的

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

看起来很有前途,从未使用过,但似乎符合您的要求:

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


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

是的,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日志溢出到flash日志。虽然您可以在代码中对其进行配置(如上所述),但通常只需配置一行或两行,然后您就可以代表自己要求配置缓存,例如

    // simplest example; you'd probably use a builder pattern or a configurable cache factory
    NamedCache cache = CacheFactory.getCache("mycache");
有关更多信息,请参阅可从中获得的文档


为了充分披露,我在甲骨文公司工作。这篇文章中表达的意见和观点是我自己的,不一定反映我雇主的意见或观点。

也许你可以用它来代替?它是一个纯Java数据库。它可以驻留在内存中,也可以写入磁盘到单个文件中。干杯,我来看看。它看起来确实像我想要的,看看它,它似乎是上面提到的JDBM的一个分支,对吗?就我所知,JDBM4被重命名为MapDB(请参阅)。谷歌代码回购协议在我看来似乎被抛弃了。