[Hibernate][ehcache][criteria]Requête ignore le cache
Bonjour,
J'ai une application WEB qui utilise Hibernate. J'essaye d'y ajouter la gestion du cache de second niveau avec ehcache pour améliorer les performances. J'ai pu le configurer correctement pour un bean mais une requête batie avec l'API criteria ignore ce cache.
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| Criteria crit = getSession().createCriteria(Demande.class);
// tri
crit.addOrder(Order.desc("demDatch"));
// jointure pour filtre
crit.createAlias("systeme", "sys")
.createAlias("sys.profils", "pro")
.createAlias("pro.roles", "rol");
/* ... Construction de la requête, coupée ici */
// clause DISTINCT
crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
crit.setCacheable(true);
// J'ai également essayé avec d'autres régions de cache, ou sans cette ligne.
crit.setCacheRegion("org.hibernate.cache.StandardQueryCache");
List listDemande = null;
try{
listDemande = crit.list();
}
catch(Exception e)
{
// ... |
Voici également le fichier ehcache.xml
Code:
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| <ehcache>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>
<!-- CACHES POUR LES OBJETS -->
<!-- cache pour les demandes -->
<cache
name="com.alikegroup.gestapp.backend.model.Demande"
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
<!-- caches pour les collections des demandes (propriétés Set demandes et Set demandeRevisionPrecedentes; )-->
<cache
name="com.alikegroup.gestapp.backend.model.Demande.demandes"
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
<cache
name="com.alikegroup.gestapp.backend.model.Demande.demandeRevisionPrecedentes"
maxElementsInMemory="500"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="true"
/>
<!-- CACHES POUR LES REQUETES -->
<cache
name="net.sf.hibernate.cache.StandardQueryCache"
maxElementsInMemory="5"
eternal="false"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
<!-- Ce cache mémorise les dates et heures de mise à jour des différentes tables.
Son timeout doit être plus élevé que celui de n'importe quel cache de requête.
Ici, conformément aux recommendations, il est configuré pour ne jamais expirer. -->
<cache
name="org.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="true"
/>
<cache
name="demandeList"
maxElementsInMemory="15"
eternal="false"
timeToLiveSeconds="300"
overflowToDisk="true"
/>
</ehcache> |
Par ailleurs, la région de cache demandeList n'apparaît pas dans la liste renvoyée par getSessionFactory().getStatistics().getSecondLevelCacheRegionNames()
Il n'y a aucun message d'erreur. Simplement, l'application ignore complétement le cache.