Caching in Hibernate

Preview:

Citation preview

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

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(…)

Michael Plöd Principal Architect @ innoQ

@bitboss

michael.ploed@innoq.com

Vielen Dank

Recommended