2013-07-06 17 views
3

有沒有一種簡單的方法讓文件支持Map?文件備份的Java地圖

定期更新地圖的內容,其中一些被刪除,另外一些被添加。爲了保持地圖中的數據安全,需要持久性。我知道一個數據庫將是理想的,但可悲的是由於數據庫無法使用的限制。

我曾嘗試:

編寫地圖每次被更新時間到文件的全部內容。這很有效,但顯然有一個缺點,即整個文件每次都會被重寫,地圖的內容預計會從幾個條目到2000的任何地方。還有一些併發問題(即寫亂序導致數據丟失)。

使用RandomAccessFile並保持指向每個文件的起始字節的指針,以便可以使用seek()查找每個條目。再次,這有一個類似的問題,改變一個條目將涉及更新後的所有引用。

理想情況下,解決方案將涉及某種緩存,這樣只有最近訪問的條目纔會保留在內存中。

有這樣的事嗎?還是可以通過第三方的jar?有人建議Oracle Coherence,但我似乎無法找到如何實現這一點,而且這看起來有點像使用大錘來破解堅果。

+0

也許你可以用[H2 Database](http://h2database.com)來代替?它是一個純Java數據庫。它可以駐留在內存中,也可以寫入磁盤到一個文件中。 –

回答

2

你可以看看爲了這個目的而創建的MapDB

MapDB提供由磁盤存儲 或堆外存儲支持的併發映射,集合和隊列。它是一個快速且易於使用的嵌入式Java數據庫引擎。

+0

看着它,它似乎是上面提到的JDBM的一個分支,是嗎?無論哪種方式,它看起來更適用。 –

+1

據我所知,JDBM4更名爲MapDB(見http://www.kotek.net/blog/JDBM4_renamed_to_MapDB)。 googlecode回購看起來被遺棄給我。 – mtsz

1

jdbm2看起來很有希望,從來沒有使用過它,但它似乎是滿足您的要求的候選人:

JDBM2提供的HashMap和TreeMap這是由磁盤存儲支持。這是保存數據的非常簡單快捷的方式。 JDBM2也具有最小的硬件要求,並且具有高度可嵌入性(jar只有145 KB)。

如果您尋找關鍵/價值商店,您會發現更多解決方案。

+0

乾杯,我會看看。它確實看起來像我想要的。 –

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期刊閃爍雜誌。雖然您可以在代碼中對其進行配置(如上所述),但它通常只是一兩行配置,然後請求代表您配置緩存(例如,

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

欲瞭解更多信息,請參閱提供的文檔從http://coherence.oracle.com/

充分披露的緣故,我在甲骨文工作。本文所表達的意見和觀點屬於我自己的觀點,並不一定反映我的僱主的意見或看法。