Проблема целостности кэша - PullRequest
2 голосов
/ 13 января 2010

У меня есть приложение, которое использует 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()); //!

Как вы можете себе представить, строка, помеченная !, также обновляет экземпляр кэша, а это не то, что мне нужно.

Может кто-нибудь придумать, как остановить это поведение, не изменяя клиента, только перехватчик?

Ответы [ 2 ]

0 голосов
/ 13 января 2010

Насколько я понимаю, вы хотите, чтобы перехватчик возвращал копию кэшированного результата, чтобы любые изменения клиента влияли только на копию?

Я не могу придумать хороший и общий способ сделать это, хотя, честно говоря. Уродливым будет полагаться на clone() или каждый раз создавать новый список.

Звучит так, как будто вы действительно должны изменить клиента, если это вообще возможно.

0 голосов
/ 13 января 2010

Что вы подразумеваете под «обновлением кеша»? Вы обеспокоены тем, что пользователи могут изменять список, возвращаемый methodWithCaching ()? Если это так, я бы предложил, чтобы этот метод возвращал неизменяемую коллекцию. Или, возможно, кеш может обнаружить, что результатом является коллекция, и обернуть его неизменяемой оболочкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...