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
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
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>
Une fenêtre
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();
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
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 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 timeToIdleSeconds="120" timeToLiveSeconds="120"
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
Espérant avoir était explicite sur le souhait désiré et le problème rencontré
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 @Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region="com.echange.model.localisation.Pays")
Merci de votre expertise.
Partager