2010-05-25 6 views
4

Je prévois d'implémenter une solution de cache dans une application Web existante. Rien de compliqué: essentiellement une carte simultanée qui prend en charge le débordement vers le disque et l'expulsion automatique. La mise en cluster du cache pourrait être requise dans le futur, mais pas maintenant. J'aime les fonctions copyOnRead et copyOnWrite d'ehcache, car cela signifie que je n'ai pas besoin de cloner manuellement des choses avant de modifier quelque chose que je sors du cache. Maintenant, j'ai commencé à regarder Infinispan, mais je n'ai rien trouvé d'équivalent ici. Est-ce qu'il existe?Infinispan équivalent à copyOnRead et copyOnWrite d'ehcache

à savoir, les tests unitaires suivants doivent passer:

@Test 
public void testCopyOnWrite() { 
    Date date = new Date(0); 
    cache.put(0, date); 
    date.setTime(1000); 
    date = cache.get(0); 
    assertEquals(0, date.getTime()); 
} 

@Test 
public void testCopyOnRead() { 
    Date date = new Date(0); 
    cache.put(0, date); 
    assertNotSame(cache.get(0), cache.get(0)); 
} 

Répondre

2

Selon un développeur JBoss, Infinispan ne supporte pas encore cette fonctionnalité. Vous devriez enregistrer une demande d'amélioration dans le Infinispan issue tracker, afin que d'autres puissent voter dessus (je le ferai).

Cela étant dit, si vous avez besoin de cette fonctionnalité maintenant, une solution serait d'étendre AbstractDelegatingCache et remplacer les méthodes get et put d'ajouter cette fonctionnalité. Vous pouvez utiliser votre propre stratégie de copie ou regarder comment EHCache l'a fait pour l'inspiration.

En outre, vous pouvez considérer le Infinispan forum si vous avez d'autres questions, puisque vous aurez plus de vues de la communauté Infinispan.

+0

Merci. Je crois que copier un graphique d'objet correctement est un problème difficile (dans le cas général), c'est pourquoi je ne voulais pas le faire moi-même. Je vais voir comment ça fonctionne, comme vous le suggérez, mais je pense que je finirai par copier manuellement ce que je retire du cache avant de le modifier. – waxwing

+0

Je pense que la stratégie par défaut utilisée par EHCache pour copier des objets est d'utiliser le mécanisme de sérialisation de Java ... (sérialiser l'objet, puis le désérialiser: vous obtenez une nouvelle instance). Bien sûr, c'est lent, et cela ne fonctionne que si les objets sont sérialisables (mais c'est souvent le cas avec les objets en cache, puisque vous voulez souvent les écrire sur le disque ...). Mais vous avez raison, copier un graphique d'objet est un problème difficile, j'ai utilisé Dozer dans le passé, vous pouvez également regarder: http://stackoverflow.com/questions/1432764/any-tool-for-java-object- to-object-mapping –

+0

Trouvés: http://svn.terracotta.org/svn/ehcache/trunk/core/src/main/java/net/sf/ehcache/store/compound/SerializationCopyStrategy.java –

7

Infinispan fait prend en charge copyOnRead/copyOnWrite, bien que le format réel ne soit pas enfichable. L'élément de configuration est lazyDeserialization dans Infinispan 4.x et storeAsBinary dans Infinispan 5.x. Les objets sont sérialisés à l'aide de l'infrastructure plug-in Marshaller, qui est utilisée pour toutes les formes de regroupement, y compris pour les appels RPC sur un réseau et le stockage sur disque.

0

Je crois que storeAsBinary ne prend effet que lorsque les objets doivent être sérialisés, ce qui signifie que lorsqu'une opération put est appelée, le propriétaire n'est pas le nœud actuel.

Cela signifie également que les cas de test dans la question peuvent passer si le propriétaire de la clé 0 n'est pas le noeud actuel, mais il échouerait toujours s'il s'agit d'un environnement à noeud unique.