EHCACHE : gestion du cache en JAVA/J2EE
26 février 2008 – 23:53
EHCACHE est un gestionnaire de cache JAVA/J2EE.
Le cache est chargé de stocker dans un espace mémoire rapide (la mémoire vive) , le résultat d’opérations obtenues à partir d’une mémoire principale qui est plus grande et plus lente (une base de données, un webservice, un fichier…).
Nous allons commencer par décrire les différentes options de configuration d’ehcache.
Installation de la librairie
- Mettez le jar ehcache dans votre classpath (WEB-INF/lib/), version 1.3 pour cette article
- Copiez y également ses dépendances (Commons Logging, Commons collections)
- Configurez ehcache.xml et mettez le également dans votre classpath.
Configuration du cache via ehache.xml
Localisation des fichies temporaires :
Stockage des fichiers dans le répertoire temp du user exemple : C :\Documents and Settings\user\Local Settings\Temp
-
<diskstore path=“java.io.tmpdir”>
-
</diskstore>
Cache par défaut
Ces réglages seront appliqués au caches crées via la méthode CacheManager.add(”nom du cache”).
Le cache par défaut est nommé “default”, donc impossibilité d’en créer de nouveaux portant ce nom.
-
<defaultcache maxelementsinmemory=“10000″>
-
eternal="false"
-
timeToIdleSeconds="86400"
-
timeToLiveSeconds="86400"
-
overflowToDisk="true"
-
diskSpoolBufferSizeMB="30"
-
maxElementsOnDisk="10000000"
-
diskPersistent="false"
-
diskExpiryThreadIntervalSeconds="120"
-
memoryStoreEvictionPolicy="LRU"
-
/></defaultcache>
- maxElementsInMemory : nombre d’éléments max en mémoire, si ce nombre est dépassé, le moins récemment utilisé est supprimé,
- eternal : positionné à true, les éléments n’expirent jamais,
- timeToIdleSeconds : longévité d’un élément non utilisé,
- timeToLiveSeconds : longévité d’un élément
- overflowToDisk : autorise l’écriture sur disque en cas de dépassement de la valeur maxElementsInMemory,
- diskSpoolBufferSizeMB : taille de la Mémoire tampon,
- maxElementsOnDisk : Nombre d’éléments maximum sur le disque, si cette limite est dépassée, le moins récemment utilisé est supprimé,
- diskPersistent : Si cette valeur est à true, les éléments vont persister, même après un redémarrage du gestionnaire de cache,
- diskExpiryThreadIntervalSeconds : intervalle d’expiration des threads, ne pas mettre trop bas sous peine d’utilisation intensive du ou des CPU,
- memoryStoreEvictionPolicy : méthode de nettoyage du cache, un timestamp est mis à jour lors de l’ajout ou de la lecture d’un élément en cache
- LRU : Least Recently Used (LRU) l’élément le moins récemment utilisé est supprimé en premier,
- LFU Less Frequently Used : l’élément le moins fréquemment utilisé est supprimé en premier,
- FIFO : first in first out : premier entré, premier sorti
Qui utilise EHCACHE :
Exemple d’utilisation avec Spring
Cet exemple présente une configuration simple pour utiliser ehcache au sein des controllers de l’application. Un tutoriel d’introduction à Spring MVC a été fait s’il vous manque les bases.
Pour la configuration, nous reprendrons celle du cache par défaut de l’exemple précédent.
Cache Manager :
Spring ira chercher la configuration dans le répertoire /WEB-INF/
-
<bean id=“cacheManagerID” class=“org.springframework.cache.ehcache.EhCacheManagerFactoryBean”></bean>
-
-
<property name=“configLocation”> <value>/WEB-INF/ehcache.xml</value> </property>
Injection au sein du controller :Pour injecter le manager de cache dans notre controller il faudra effectuer la configuration suivante :
-
<bean id=“indexController” class=“com.cestpasdur.controllers.IndexController”></bean>
-
<property name=“cacheManager” ref=“cacheManagerID”> </property>
Il faudra également ajouter les accesseurs correspondants.
-
/**
-
* Gestionnaire de cache
-
**/
-
private CacheManager cacheManager ;public void setCacheManager(CacheManager cacheManager) this.cacheManager = cacheManager ;
Le cache contient une sorte de hashMap<String, Objet> d’élement identifiés par leurs clés. Ici, nous devons récupérer un cache nommé cacheName, nous devons donc faire appel à la méthode getCache(”cacheName”) afin d’obtenir le cache associé. Le cache par défaut s’obtiendra via la même méthode et le paramètre “default”.
-
<pre>Cache cache=cacheManager.getCache(“cacheName’”) ;
-
/** Mettre instance_Objet en cache **/
-
/** Récupérer l’instance de l’objet précédement ajoutée **/
-
((Classe_Instance)cache.get(“cle_du_cache”).getObjectValue()).getItems()) ;</pre>
Avec ces quelques lignes vous pourrez créer votre premier cache, c’est cependant un exemple de base, vous pouvez y rajouter un interceptor de cache qui interceptera les appels à votre DAO qui vous rendra un résultat à partir de votre cache et non de votre DAO…