2012-07-11 94 views
0

在我們的項目中,我們必須存儲有關多個設備的當前信息。設備定期將這些信息傳輸到服務器。服務器將接收到的信息存儲在多個表中,並更新同步列表中的對象,這些列表顯示了設備的當前狀態。尋找內存中的緩存解決方案

爲避免數據庫負載過重,某些視圖通過同步列表訪問緩存的對象,以顯示所請求設備的狀態信息。

的同步列表位於服務類中,看起來像如下:

private Map<Long, DeviceStatus> statusMap = java.util.Collections.synchronizedMap(new HashMap<Long, DeviceStatus>()) // key = unique id 

服務API提供的方法進行更新,刪除,...通過ID或其他屬性列表條目。

我們對當前的解決方案不滿意,因爲您無法在更多正在運行的實例之間共享狀態信息。此外,不可能監視這些列表的內存使用情況。

我們正在考慮兩種解決方案:

解決方案1:

介紹一個HSQLDB數據庫(與數據源插件的幫助下)來存儲頻繁更新的信息。有了這個解決方案,像findBY這樣的GORM功能將會保留。缺點:幾個系統之間的存儲分配。

解決方案2:

落實POJO DeviceStatus爲域類,並使其緩存。將來的兵馬俑可以用來在多個系統上共享緩存的信息。缺點:我們不需要將這些信息存儲在數據庫中。有沒有一種方法或選項可以僅將域類存儲在內存中。在啓動期間,DeviceStatus緩存通過從多個數據源(=表)獲取信息進行初始化。

要求:

  • 訪問緩存的對象與像findBy方法
  • 在幾個系統(使用了Ehcache和兵馬俑)

  • 分配緩存,你怎麼看待這些解決方案和有沒有更好的解決方案,描述的情況?我們可以使用新推出的緩存插件來存儲狀態對象,並通過除了唯一鍵之外的其他屬性來訪問它們嗎?

  • 回答

    0

    你有沒有考慮過使用EhCache? EhCache可用於緩存任何對象,而不僅僅是域類(儘管您可以將它用作Hibernate的二級緩存)。當內存中的緩存已滿時,您可以將EhCache設置爲透明地將對象溢出到磁盤,以防內存不足。

    如果您需要跨節點同步所有緩存,那麼您可以使用Terracotta作爲分佈式緩存,並且Terracotta與EhCache兼容。

    否則你的問題似乎有點不清楚;你需要查詢這些域對象的功能嗎?

    0

    你看過memcache http://memcached.org?這是一個開源的內存緩存系統,易於設置。您可以將任何可用的服務器添加到池中。你通過鍵/值存儲數據,所以只要確保你填入的內容是可序列化的。它將作爲一個獨立的層從你的webapps運行,所以你的任何應用程序實例都可以在不需要兵馬俑的情況下訪問它,正如我所瞭解的,它有助於你的JVM集羣共享內存。

    +0

    在這個時候我們決定採取ehcache。很抱歉,很晚的答案! – hitty5 2014-10-02 14:25:50

    相關問題