文件支持的Java地图

时间:2013-07-06 21:18:18

标签: java oracle-coherence randomaccessfile

是否有一种简单的方法来备份文件?

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

我试过了:

每次更新时,将地图的全部内容写入文件。这有效,但显然有一个缺点,即每次重写整个文件,地图的内容预计会从几个条目到〜2000。还存在一些并发问题(即,无序写入会导致数据丢失)。

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

理想情况下,解决方案会涉及某种缓存,因此只有最近访问过的条目才会保留在内存中。

有这样的事吗?或者可以通过第三方罐子获得?有人建议使用Oracle Coherence,但我似乎无法找到如何实现这一点,而且似乎有点像使用大锤来破解坚果。

3 个答案:

答案 0 :(得分:2)

您可以查看为此目的而创建的MapDB

  

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

答案 1 :(得分:1)

jdbm2看起来很有前途,从未使用它,但它似乎是满足您要求的候选者:

  

JDBM2提供由磁盘存储支持的HashMap和TreeMap。保存数据非常简单快捷。 JDBM2也具有最低的硬件要求,并且具有高度可嵌入性(jar只有145 KB)。

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

答案 2 :(得分:1)

是的,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");

有关详细信息,请参阅http://coherence.oracle.com/

中提供的文档

为了充分披露,我在Oracle工作。本文中表达的观点和观点是我自己的,不一定反映我的雇主的意见或观点。