je une application qui utilise ehcache pour le cache (mais je pense que ce problème est le cadre agnostique), avec un intercepteur de méthode donc en gros si je marque ma méthode pour la mise en cache quelque chose comme ceci happnes:problème d'intégrité du 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;
}
Jusqu'ici tout va bien. La chose que je suis en cache une méthode qui retourne un Array
, et est appelé comme ceci:
List<Object> result = methodWithCaching();
result.add(new Object()); //!
Comme vous pouvez l'imaginer, la ligne marquée !
met également à jour l'instance de cache, et ce n'est pas ce que je veux.
Quelqu'un peut-il penser à un moyen d'arrêter ce comportement sans modifier le client, seul l'intercepteur?
Je veux que les utilisateurs fassent ce qu'ils veulent avec la liste. Mais imaginez ce scénario: methodinvocation (1), cache miss, userupdates les listes et le cache est mis à jour aussi. methodinvocation (2), cache hit (maintenant la liste contient 1 élément), l'utilisateur met à jour la liste et le cache est mis à jour aussi. methodinvocation (3), cache hit (maintenant la liste contient 2 éléments), et ainsi de suite. –
Voulez-vous que l'utilisateur dispose d'une copie locale de l'objet mis en cache et non d'une instance partagée? – Kevin
C'est vrai, et probablement sans modifier le client, juste l'intercepteur –