2010-12-15 110 views
1

J'essaie de migrer mon code de projet d'OSCache vers EhCache.Spécification de la capacité globale EhCache

Nous avons utilisé OSCache non seulement comme fournisseur de cache Hibernate de second niveau, mais également pour stocker d'autres objets de nature différente. Ils ont tous heureusement partagé la même instance de cache sans aucune collision due à des clés de cache qui ne se chevauchent pas.

Une grande différence lors du déplacement vers EhCache est que chaque région a son instance de cache différente. Ceci est potentiellement bon car il peut améliorer la vitesse de recherche car les données de nature différente résident séparément. Malheureusement, cela a un prix d'enfer de configuration. Laisse-moi expliquer.

Dans le monde OSCache, je configurerais ma capacité de cache pour être, disons, 10000. Maintenant, si une installation particulière nécessiterait/pourrait permettre plus de RAM, je le ferais facilement jusqu'à 50000 et cela ferait l'affaire. Maintenant, dans EhCache, je dois changer le réglage par portion de ce delta pour chaque région! Par ailleurs, une installation peut avoir une utilisation plus élevée d'objets de type X alors qu'une autre installation peut préférer une rotation plus élevée d'objets de type Y. Nous avons des dizaines d'installations et chaque installation aurait des centaines de caches différents. Pour cela, nous aurions à embaucher des gens qui ne font rien d'autre que de surveiller les modèles de cache et de peaufiner les paramètres!

Je m'attendais à CacheManager pour avoir une sorte de paramètre de capacité de cache global et chaque cache interne se battrait pour plus de capacité, en fonction de l'utilisation d'entrée. Cependant, la seule façon que j'ai trouvé pour définir la capacité de cache est via CacheConfiguration qui est plusieurs-à-un contre CacheManager. Jusqu'ici, la seule option que je puisse voir est d'essayer de forcer le Hibernate à utiliser un cache global pour toutes les entités. Est-ce que quelqu'un sait comment faire cela? Y a-t-il d'autres meilleures solutions pour mon scénario?

Répondre

2

Vous pouvez essayer d'avoir un seul cache et d'y ajouter des décorateurs. Les décorateurs peuvent avoir des noms correspondant aux noms de vos régions afin qu'Hibernate puisse utiliser ces caches, mais ces décorateurs utiliseraient le même cache en dessous. Il n'y a donc qu'une seule config de cache à gérer. Vous pouvez y parvenir en implémentant le Custom cache decorators et en configurant les noms de vos caches décorés.

Vous pouvez avoir ehcache.xml quelque chose comme ceci:

<defaultCache maxElementsInMemory="10000" eternal="false" 
    overflowToDisk="false"/> 

<cache name="singleSharedCache" maxElementsInMemory="2000" 
    eternal="false" overflowToDisk="false"> 
    <cacheDecoratorFactory class="com.xyz.util.CustomEhcacheDecoratorFactory" 
     properties="name=org.hibernate.tutorial.domain.Person" /> 
    <cacheDecoratorFactory class="com.xyz.util.CustomEhcacheDecoratorFactory" 
     properties="name=org.hibernate.tutorial.domain.Event" /> 
</cache> 

Le « com.xyz.util.CustomEhcacheDecoratorFactory » est un décorateur ehcache personnalisé classe usine qui est utilisé pour créer les ehcaches décorées. Vous pouvez utiliser l'attribut "properties" pour configurer l'ehcache décorée comme vous le souhaitez, ici vous n'utilisez qu'une propriété name pour configurer le nom du nouvel ehcache décoré. Toutes les autres opérations peuvent être déléguées au cache sous-jacent.

Fournissant un décorateur de cache personnalisé qui fonctionnerait dans ce cas d'utilisation, il réutilise EhcacheDecoratorAdapter qui vient dans le fichier ehcache jar et remplace simplement getName(). les délégués EhcacheDecoratorAdapter toutes les opérations à un ehcache sous-jacente que vous passez dans le constructeur:

 

package com.xyz.util; 

import java.util.Properties; 

import net.sf.ehcache.Ehcache; 
import net.sf.ehcache.constructs.CacheDecoratorFactory; 
import net.sf.ehcache.constructs.EhcacheDecoratorAdapter; 

public class CustomEhcacheDecoratorFactory extends CacheDecoratorFactory { 

    public Ehcache createDecoratedEhcache(final Ehcache cache, 
      final Properties properties) { 
     return new EhcacheDecoratorAdapter(cache) { 
      private final String name = properties.getProperty("name"); 

      public String getName() { 
       return name; 
      } 
     }; 
    } 

    public Ehcache createDefaultDecoratedEhcache(final Ehcache cache, 
      final Properties properties) { 
     return new EhcacheDecoratorAdapter(cache) { 
      private final String name = properties.getProperty("name"); 

      public String getName() { 
       return name; 
      } 
     }; 
    } 
} 

+0

Wow, merci beaucoup pour cette réponse, je vais certainement jeter un oeil à ce retour après Noël. – mindas