У меня есть приложение, которое использует EHCache для кэша (но я думаю, что эта проблема является основой агностика), с помощью метода перехватчика так в основном, если я отмечаю свой метод для кэширования что-то вроде этого happnes:Cache проблема целостности
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), пропустить кеш, обновить списки пользователей и обновить кеш. methodinvocation (2), кеш-хит (теперь список содержит 1 элемент), пользователь обновляет список, и кеш также обновляется. methodinvocation (3), кеш-хит (теперь список содержит 2 элемента) и т. д. –
Вы хотите, чтобы у пользователя была локальная копия кэшированного объекта, а не общий экземпляр? – Kevin
Правильно, и, возможно, без изменения клиента, только перехватчик –