Bonjour,
Je souhaite utiliser EhCache pour conserver des résultats de plusieurs requêtes dans un cache (au delà de la transaction/session Hibernate) afin d'optimiser un traitement.
Dans mon fichier hibernate.cfg.xml, j'ai bien déclaré :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> <property name="hibernate.cache.use_query_cache">true</property> <property name="hibernate.generate_statistics">true</property> <!-- Force Hibernate à stocker les données dans le cache de second niveau dans un format plus adapté à la visualisation par un humain. --> <!-- <property name="hibernate.cache.use_structured_entries">true</property> -->
Voici le contenu de mon fichier ehcache.xml :
Voici la classe associée à l'entité Voiture :
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 <ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" /> <cache name="fr.xxx.yyy.zzz.Voiture" maxElementsInMemory="300" eternal="true" timeToIdleSeconds="3600" timeToLiveSeconds="3600" overflowToDisk="false" /> </ehcache>
Au niveau du mapping de cette entité, j'ai bien précisé : « <cache usage="read-write"/> ».
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public class Voiture implements Serializable { private Long id; private String marque; private String modele; private Date dateMiseCirculation; // + getters / setters }
Si je fais appel aux méthodes load(), get(), iterate() (et pas list() d'après ce que j'ai pu lire) de l'objet SessionFactory, mon cache de second niveau va fonctionner pour me renvoyer instantanément le résultat sans effectuer la requête.
Maintenant, si j'écris la requête HQL suivante :
Est-ce que lors du premier appel à la méthode HQL ci-dessus, le cache de second niveau sera alimenté ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Query q = getSession().createQuery("FROM Voiture v WHERE v.marque = ? AND v.modele = ?"); q.setParameter(0, "PEUGEOT"); q.setParameter(1, "206"); q.setCacheable(true); q.setRegionCacheable("RecherchePeugeot206"); return (Voiture)q.uniqueResult();
Et donc, est-ce que lors du deuxième appel à cette méthode, Hibernate ira lire l'objet dans le cache de second niveau pour me renvoyer le résultat sans effectuer la requête ?
Si oui, quels paramètres le cache de second niveau va-t-il prendre dans le fichier ehcache.xml définit précédemment ?
La durée maximale de présence de mon objet Voiture dans le cache sera-t-elle de 120 ou 3600 secondes ???
Imaginons une autre requête HQL :
Même questions que précédemment :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Query q = getSession().createQuery("SELECT MAX(v.dateMiseCirculation) FROM Voiture v"); q.setCacheable(true); q.setRegionCacheable("RechercheVoiturePlusRecente"); return (Date)q.uniqueResult();
- Quels paramètres le cache de second niveau va-t-il prendre dans le fichier ehcache.xml définit précédemment ?
- La durée maximale de présence de mon objet Date (contenant la date de mise en circulation du véhicule le plus récent) dans le cache sera-t-elle de 120 ou 3600 secondes ???
Plus, généralement, existe-t-il un moyen de définir le maxElementsInMemory, le eternal, le timeToIdleSeconds, le timeToLiveSeconds, etc pour chaque cache de requêtes ???
Merci d'éclairer ma lanterne sur le cache de second niveau même si j'ai essayé de me documenter au maximum.
Merci pour votre aide,
F.
Partager