CACHING in
Hibernate
Michael Plöd
Principal Architect @ innoQ
@bitboss
michael.ploed@innoq.com
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
Anwendung
1st 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>
Entitieswerden 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 API
sessionFactory.evict(Person.class, id);


sessionFactory.evict(Person.class);

sessionFactory.evictCollection("Person.adressen", personId);

sessionFactory.evictCollection(„Person.adressen");



session.setCacheMode(CacheMode.PUT)

Cache Modes
NORMAL
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(…)
Michael Plöd
Principal Architect @ innoQ
@bitboss
michael.ploed@innoq.com
Vielen Dank

Caching in Hibernate