我有一個使用了Ehcache緩存(但我認爲這個問題是框架無關),用方法攔截所以基本上,如果我記住我的方法來緩存這樣的事情happnes的應用程序:緩存完整性問題
public Object invoke(MethodInvocation mi) throws Throwable {
Object result = cache.get(key);
//key comes from MethodInvocation processing
if (result == null) {
result = mi.proceed();
cache.put(key, result);
}
return result;
}
到目前爲止好。事情我緩存,返回一個Array
的方法,並得到這樣調用:
List<Object> result = methodWithCaching();
result.add(new Object()); //!
正如你可以想像,行標有!
還更新緩存實例,這不是我想要的。
有人可以想到一種方法來阻止這種行爲,而不修改客戶端,只有攔截器?
我希望用戶在列表中做任何他們想做的事情。但想象一下這種情況:methodinvocation(1),緩存未命中,userupdates列表和緩存也得到更新。 methodinvocation(2),緩存命中(現在列表包含1個元素),用戶更新列表並且緩存也被更新。 methodinvocation(3),緩存命中(現在列表包含2個元素)等等。 – 2010-01-13 18:28:16
您是否希望用戶擁有緩存對象的本地副本而不是共享實例? – Kevin 2010-01-13 18:37:19
這是正確的,可能沒有修改客戶端,只是攔截器 – 2010-01-13 21:06:24