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 :
Voici également le fichier ehcache.xml
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 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) { // ...
Par ailleurs, la région de cache demandeList n'apparaît pas dans la liste renvoyée par getSessionFactory().getStatistics().getSecondLevelCacheRegionNames()
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
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>
Il n'y a aucun message d'erreur. Simplement, l'application ignore complétement le cache.
Partager