Date post: | 15-Aug-2015 |
Category: |
Software |
Upload: | michael-ploed |
View: | 213 times |
Download: | 0 times |
CACHING in Hibernate
Wichtige Themen
1st Level Cache 2nd Level Cache
Query Cache Interfaces
Weitere Themen
Flush Verhalten Isolation Levels
Cache Infrastruktur
Best Practices
Aufbau des mehrschichtigen
Caching-Systems
Anwendung1st level cache
2nd level cache
DB
Die Anwendung interagiert mit der Session
Jede Session ist ein 1st level cache
Der 2nd level cache bedient alle Sessions einer SessionFactory
Der Datenbank Cache hat nichts mit Hibernate zu tun
LOOKUP Lifecyle
Wie werden Entitäten geladen?
Befindet sich die Entität
in der Session
Befindet sich die Entität
im 2nd Level Cache
Datenbank Zugriff
1st level Cache
1st level Cache
Der 1st Level Cache entspricht der Session / dem Entity Manager und wird auch Persistenz Context genannt.
Es gibt keine Eviction Policy. Wir als Entwickler müssen uns um den 1st Level Cache kümmern
ACHTUNG!
Der Persistenz Kontext wird im Laufe der Zeit immer größer
Diät Tips?
Grundregeln:
ORMs sind keine guten Batch-Tools
Regelmässiges Flush & Clear
JDBC-Batch Size
Code DEMO
2nd level Cache
2nd level Cache
Der 2nd Level Cache ist nicht auf die Session / den Entity Manager gescoped sondern auf die jeweiligen Factories
Hibernate sieht für die Interaktion mit dem 2nd Level Cache lediglich Mappings, Konfiguration und Interfaces vor
Persistenz Kontext A
First Level Cache
Persistenz Kontext B Persistenz Kontext C
Second Level Cache
Cache Concurrency Strategy Query Cache
Cache Implementierung
Klassen Cache Region
Collection Cache Region
Query Cache Region
Update Timestamps Cache Region
Details
Unterhalb der
Spitze des Eisbergs
Der 2nd Level Cache ist optional
Muss via Config und Annotations aktiviert werden
Anbindung von Cache Providern via SPI
Konfiguration<property name="cache.provider_class"> org.hibernate.cache.internal.NoCacheProvider</property>
<property name="cache.provider_class"> org.hibernate.cache.ehcache.EhCacheRegionFactory </property>
Entities werden von Hibernate nicht automatisch gecached
javax.persistence.sharedCache.mode
ENABLE_SELECTIVE Entitäten werden nicht gecached, ausser sie werden als cachable markiert
DISABLE_SELECTIVE Entitäten werden gecached, ausser sie werden als nicht-cachable markiert
ALL Alle Entitäten werden immer gecached
NONE Entitäten werden niemals gecached
Mapping@Entity @Cacheable @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class Person { ... }
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public Set<Person> getPersons() { return persons; }
Concurrency Strategies
Read Only Für rein lesenden Zugriff
Read / Write
•Read Committed Isolation Level •In JTA Umgebung muss Transaktions-Manager
Lookup konfiguriert sein •Im Cluster muss die Cache Implementierung
Locking unterstützen
Nonstrict Read / Write
•Keine Konsistenz Garantie •Geeignet für Daten die sich wenig ändern •In JTA Umgebung muss Transaktions-Manager
Lookup konfiguriert sein •
Transactional
•Repeatable Read Isolation Level •In JTA Umgebung muss Transaktions-Manager
Lookup konfiguriert sein
Cache APIsessionFactory.evict(Person.class, id); sessionFactory.evict(Person.class);
sessionFactory.evictCollection("Person.adressen", personId);
sessionFactory.evictCollection(„Person.adressen");
session.setCacheMode(CacheMode.PUT)
Cache ModesNORMAL Die Session liest und Schreibt Daten aus / in
den 2nd Level Cache
GET Die Session liest aus dem 2nd Level Cache und führt nur Updates (keine Puts) aus
PUT Die Session liest nicht aus dem 2nd Level Cache, schreibt aber Daten hinein
REFRESH Die Session liest nicht aus dem 2nd Level Cache, schreibt nur Updates hinein
Code DEMO
Query Cache
Query Cache
Der Query Cache gehört zum 2nd Level Cache und zielt nicht auf Entitäten sondern auf Ergebnisse von HQL / Criteria Abfragen ab
Der Query Cache muss neben dem 2nd Level Cache zusätzlich in der globalen Konfiguration und auf jeder zu cachenden Query aktiviert werden
Konfiguration<property name=„cache.use_query_cache"> true</property>
session.createQuery(…) .setCacheable(true) .setCacheRegion(…)