EHCache 改变​​原始元素

EHCache change on original element

我在 java 项目中使用 EHCache。我在这段代码上遇到了问题。我的对象此时被缓存了!

    Element lElem = cacheManager.get("KEY");

    if (lElem != null) {
        // Get my cached objects
        lLMyVO = (List<MyVO>) lElem.getObjectValue();
    }else{
         // Do something to set element
    }

    // Add some elements on lLMyVO list :
    for (MyVO lAnotherMyVO : lAnotherList) {
        lLMyVO .add(lMyVO );
    }

此时,我的 lLMyVO 列表中有 lAnotherList 个元素!没关系。但是在我的 EHCache 对象中也添加了 lAnotherList 元素!而且不行,我不想改缓存。

似乎lLMyVO它不是一个新对象,而只是对缓存中对象的引用。

你知道怎么做吗?

默认情况下,您的元素将作为引用存储在 EHCache 中,直到出现文件写入或其他复制。为防止这种情况,您可以在缓存配置中使用 'copyOnWrite'/'copyOnRead' 属性。因此,将在您的 put/get 操作中复制对象,并且不允许更改。

Ehcache documentation for reference

(这可能不是理想的解决方案,只是提供另一种选择)

添加到 @Alexey 的回答中.. 如果只有少数情况会发生突变,您可以简单地选择在从 EHCache 检索后克隆对象。这可能会节省一些每次复制它的开销。