Bonjour à tous !

Je vous expose un petit souci, dû aussi à peut être une incompréhension sur ehCache.

Plusieurs test :

Jpa2.0, hibernate 3, ehcache 1.5

le persistence.xml
J'autorise le cache de niveau 2

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
 
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
<property name="use_sql_comments" value="false" />
<property name="hibernate.query.substitutions" value="true" />
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
<property name="hibernate.cache.provider_configuration_file_resource_path" value="/ehcache.xml" />
<property name="hibernate.jdbc.use_streams_for_binary" value="false" />
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.generate_statistics" value="true"/>
</properties>

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
 
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
 
    <diskStore path="java.io.tmpdir"/>
 
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"/>
 
     		<cache name="com.echange.model.localisation.Pays"
     		eternal="true" overflowToDisk="true"	
           maxElementsInMemory="500" memoryStoreEvictionPolicy="LRU"/>
 
            <cache name="com.echange.model.localisation.Continent"
     		eternal="true" overflowToDisk="true"	
           maxElementsInMemory="50" memoryStoreEvictionPolicy="LRU"/>
 
            <cache name="com.echange.model.localisation.RegionContinent"
     		eternal="true" overflowToDisk="true"	
           maxElementsInMemory="100" memoryStoreEvictionPolicy="LRU"/>
 
           <!-- Special -->
           <cache name="special.pays"
     		eternal="true" overflowToDisk="true"	
           maxElementsInMemory="500" memoryStoreEvictionPolicy="LRU"/>
 
            <cache name="special.continent"
     		eternal="true" overflowToDisk="true"	
           maxElementsInMemory="50" memoryStoreEvictionPolicy="LRU"/>
 
            <cache name="special.regionContinent"
     		eternal="true" overflowToDisk="true"	
           maxElementsInMemory="100" memoryStoreEvictionPolicy="LRU"/>
 
           <cache name=" com.echange.model.compte.DomainActivity"
           maxElementsInMemory="1000"/>
 
           <cache name="contactCache" maxElementsInMemory="500" eternal="true" overflowToDisk="false"
			memoryStoreEvictionPolicy="LFU"/>
 
</ehcache>
Cache Sur trois requêtes:

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
 
Query query1  = em.createQuery("from Continent");
			query2.setHint("org.hibernate.cacheable", true);
			return (List<Continent>) query2.getResultList();
 
....
 
Query query2  = em.createQuery("from RegionContinent");
			query2.setHint("org.hibernate.cacheable", true);
			return (List<RegionContinent>) query2.getResultList();
 
....
 
Query query3  = em.createQuery("from Country");
			query2.setHint("org.hibernate.cacheable", true);
			return (List<Country>) query2.getResultList();
Une fenêtre

Statistics :
query cache puts=3,query cache hits=1,query cache misses=3

Si je relance (rafraichis) le navigateur
query cache puts=3,query cache hits=4,query cache misses=3

J'ouvre une nouvelle fenêtre du navigateur
query cache puts=3,query cache hits=8,query cache misses=3
(sachant que les statistics apparaissent avant la transaction commité de ces trois requêtes effectué)

je rafraichis
query cache puts=6,query cache hits=9,query cache misses=6

Donc ici on à rajouté 3 requêtes en cache !!!

Ce qui veut dire, qu'a chaque fois qu'on lancera une fenêtre, on initialisera encore en cache les 3 requêtes (continent, region, pays), hors je ne veut pas du tout, ça va considérablement augmenter le cache !!

J'aimerai que ces requêtes sois reconnu une seul fois, que leur résultat soi en cache et qu'on les récupère en cache, et non requêter la base a chaque fois.

Que ce cache de niveau deux donc, sois accessible à toutes les sessions et utilisateurs donc.

Hors ici, j'ai l'impression qu'il est rattaché à une session navigateur ?

De plus, au bout de une deux minute, si je rafraichis la page, les requêtes sont de nouveaux ajouté en cache !
Du si je comprend bien par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
Si je met eternal = true, je persist pour toujours si je comprend bien ? (ce qui m'intéresse, car je ne veux charger qu'une fois pour toute, que en READ, très très rarement de write ), Mais si je modifie ma base sans passer par Hibernate ?

Il me semble bien avoir compris pourtant que le cache de niveaux deux était partagé pour toute session, transaction ?

Ce que je veux

(ihm1 - getContinent() --> server - getContinent() )
regarde en cache
requête la base
requêtes en cache instaurés
retourne Entities
(ihm1 - getContinent() --> server - getContinent() )
regarde en cache
retourne Entities

(ihm2 - getContinent() --> server - getContinent() )
regarde en cache
retourne Entities

ça doit marcher comme ça si je ne me trompe pas !

Comment faire pour que cela reste en cache, pour tout utilisateur ?


Ps : le problème avec le cache sur les Entity et le même
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region="com.echange.model.localisation.Pays")
Espérant avoir était explicite sur le souhait désiré et le problème rencontré

Merci de votre expertise.