Utiliser OsCache dans vos classes

OsCache est une librairie Java très bien foutue et beaucoup utilisée pour mettre en place un système de cache, particulièrement sur les applications web. La documentation est plutôt bien faite, notamment pour l'utilisation d'OsCache directement dans vos JSP ou bien comme un filtre (Java Filter) pour cacher toute une partie du contenu de votre site internet en fonction du type de fichier (cacher toutes les pages .html par exemple).

Vous pouvez également utiliser OsCache directement dans vos classes pour cacher des objets, mais là, si un exemple de code est fourni, la mise en place n'est pas très bien expliquée, surtout au niveau de la gestion des threads et du système du Singleton. Voyons la mise en place de cela.

C'est la classe "GeneralCacheAdministrator" qui vous permet de récupérer et de gérer (charger et décharger des objets) le cache directement dans vos classes. Le problème, pour que cela soit efficace c'est qu'il faut bien que votre application n'ai qu'un seul cache et non pas un par instance (cela reviendrai à ce que chaque client utilise son propre cache à lui ! ;-))

Il faut donc créer une classe Singleton, qui ne charge qu'une seule fois (au démarrage ou au premier appel) "GeneralCacheAdministrator" puis qui ensuite retourne systématiquement la même instance de façon à utiliser le même cache. Voici un exemple d'implementation d'une telle classe :

package com.bourzeix.util;
import com.opensymphony.oscache.general.GeneralCacheAdministrator;
public class TheCacheManager {
 // Private constructor suppresses generation 
 // of a (public) default constructor
 private TheCacheManager() {}
 private static class TheCacheManagerHolder {
  private static GeneralCacheAdministrator admin = 
                               new GeneralCacheAdministrator();
 }
 public static GeneralCacheAdministrator getInstance() {
   return TheCacheManagerHolder.admin;
 }
}

Ensuite dans votre application, il ne vous reste plus qu'a initialiser le cache en utilisant ce Singleton :

//Recuperation du Cache
GeneralCacheAdministrator admin = TheCacheManager.getInstance();
int myRefreshPeriod = 3600; // Une heure !

Puis à l'utiliser, pour y stocker directement des objets :

//sectors
String My_Key = "My_Key";
Vector Objects_cached;
// Store in the cache
admin.putInCache(My_Key, Objects_cached);

Puis les relire :

// Get from the cache
Objects_cached = (Vector) admin.getFromCache(My_Key, myRefreshPeriod);

Et voilà !

Haut de page