Bonjour,
j'essaie de mettre en cache des résultats de requêtes SQL, histoire qu'elles soient exécutées moins souvent et que les perf de l'appli soient améliorées.
Tous les accès aux BD sont faits avec JDBC, avec des preparedStatement. Aucun système de persistance est mis en place (c'est pourquoi je veux cacher).
Bref, j'essaye d'utiliser EHCache qui apparemment fait bien son boulot dans ce domaine, mais étant débutant en JEE je rencontre quelques difficultés.
Pour résumé, j'ai mes EJB dans un package dans un jar. J'ai créé un autre package dans ce même jar dans lequel j'ai mis les classes d'implémentation et d'interface de mes caches :
-Cache.java (interface)
-CacheImpl.java
-CacheFactory.java
-ehcache-config.xml
Ça plante à la récupération du cache. J'utilise mon cache comme ça :
Mais le log de GlassFish me sort plein d'erreurs.. notamment ces lignes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 public ArrayList<String> selectPart(String requete) throws Exception { PreparedStatement psSel = null; ResultSet rs = null; try { checkConnectionBDGdP(); //initialisation du cache (une seule fois) if(cacheInit==false){ CacheFactory.init(Constantes.cachePATH); sqlCachePart = CacheFactory.getCacheInstance("SqlCacheSelectPart"); cacheInit=true; } //on teste si le cache possède la liste recherchée /* if(sqlCachePart.get(requete)!=null){ return (ArrayList<String>) sqlCachePart.get(requete); } //sinon on fait le traitement else{ */ psSel = connBDGdP.prepareStatement(Constantes.SELECT_QUERY); psSel.setString(1, requete); rs = psSel.executeQuery(); ArrayList<String> parts = new ArrayList<String>(); while(rs.next()) { String partie = rs.getString(1); parts.add(partie); } //on place le nouveau couple de valeur dans le cache // sqlCachePart.put(requete, parts); return parts; // }
Donc comment utiliser correctement EHCache ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Caused by: net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following: 1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessary 2. Shutdown the earlier cacheManager before creating new one with same name.
J'ai essayé d'initialiser directement le cache dans la méthode getCacheInstance mais là du coup ça me recréé autant de caches qu'il y a de requêtes..
Des idées ?
Merci !
Partager