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 : 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)
		{
// ...
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
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.