缓存完整性问题

时间:2010-01-13 17:27:26

标签: java caching pass-by-reference ehcache

我有一个使用ehcache进行缓存的应用程序(但我认为这个问题与框架无关),使用方法拦截器,所以基本上如果我标记我的方法来缓存类似于这样的事情:

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()); //!

可以想象,标有!的行也会更新缓存实例,这不是我想要的。

有人可以想办法在不修改客户端的情况下停止此行为,只有拦截器吗?

2 个答案:

答案 0 :(得分:0)

“更新缓存”是什么意思?您是否担心用户可以修改methodWithCaching()返回的List?如果是这样,我会建议该方法返回一个不可修改的集合。或者缓存可能会检测到结果是一个Collection并用一个不可修改的包装器包装它。

答案 1 :(得分:0)

我的理解是你希望拦截器返回缓存结果的副本,这样任何客户端修改只会影响副本吗?

尽管说实话,我想不出一个好的和一般的方法。丑陋的将是依赖clone(),或每次都创建一个新的列表。

听起来你应该真的修改客户端,如果可能的话。