我是Oracle Coherence的新手,我已经尝试了hello-world示例并且工作正常,但我注意到了我不想要的行为,这是我将对象存储到缓存时,并尝试获取此对象并更新它,此更新没有传播到缓存,我不确定,但我认为这是由于使用了com.tangosol.util.SafeHashMap。
缓存配置: 我使用的是默认的coherence.jar配置文件。
我的代码:
NamedCache cache = CacheFactory.getCache("test");
HashMap<Integer, LinkedHashMap<Integer, String>> m = new HashMap<Integer, LinkedHashMap<Integer, String>>();
Map<Integer, String> l = new LinkedHashMap<Integer, String>();
l.put(1, "val-1");
l.put(2, "val-2");
Map<Integer, String> l2 = new LinkedHashMap<Integer, String>();
l2.put(3, "val-3");
l2.put(4, "val-4");
m.put(1, (LinkedHashMap<Integer, String>) l);
m.put(2, (LinkedHashMap<Integer, String>) l2);
cache.put(1, l);
cache.put(2, l2);
System.out.println(cache.get(1));
System.out.println(cache.get(2));
// output is:
//{1=val-1, 2=val-2}
//{3=val-3, 4=val-4}
((LinkedHashMap<Integer, String>)cache.get(1)).remove(1);
System.out.println("====== AFTER CHANGE ========");
System.out.println(cache.get(1));
System.out.println(cache.get(2));
// output STILL :
//{1=val-1, 2=val-2}
//{3=val-3, 4=val-4}
输出:
{1=val-1, 2=val-2}
2014-11-16 12:51:53.214/6.333 Oracle Coherence GE <D4> (thread=ShutdownHook, member=1): ShutdownHook: stopping cluster node
{3=val-3, 4=val-4}
====== AFTER CHANGE ========
{1=val-1, 2=val-2}
{3=val-3, 4=val-4}
上面的行为在我看来就像是HttpSession对象。
我的问题是,如何更改此行为,当我更改对象时,此更改会传播到缓存?
答案 0 :(得分:0)
从缓存中获取对象时,您正在使用副本。如果您还想更改缓存,则需要将新的/更改的对象放回缓存中。