caching in hibernate

29
CACHING in Hibernate

Upload: michael-ploed

Post on 15-Aug-2015

213 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Caching in Hibernate

CACHING in Hibernate

Page 2: Caching in Hibernate

Michael Plöd Principal Architect @ innoQ

@bitboss

[email protected]

Page 3: Caching in Hibernate

Wichtige Themen

1st Level Cache 2nd Level Cache

Query Cache Interfaces

Page 4: Caching in Hibernate

Weitere Themen

Flush Verhalten Isolation Levels

Cache Infrastruktur

Best Practices

Page 5: Caching in Hibernate

Aufbau des mehrschichtigen

Caching-Systems

Page 6: Caching in Hibernate

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

Page 7: Caching in Hibernate

LOOKUP Lifecyle

Page 8: Caching in Hibernate

Wie werden Entitäten geladen?

Befindet sich die Entität

in der Session

Befindet sich die Entität

im 2nd Level Cache

Datenbank Zugriff

Page 9: Caching in Hibernate

1st level Cache

Page 10: Caching in Hibernate

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

Page 11: Caching in Hibernate

ACHTUNG!

Der Persistenz Kontext wird im Laufe der Zeit immer größer

Diät Tips?

Page 12: Caching in Hibernate

Grundregeln:

ORMs sind keine guten Batch-Tools

Regelmässiges Flush & Clear

JDBC-Batch Size

Page 13: Caching in Hibernate

Code DEMO

Page 14: Caching in Hibernate

2nd level Cache

Page 15: Caching in Hibernate

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

Page 16: Caching in Hibernate

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

Page 17: Caching in Hibernate

Unterhalb der

Spitze des Eisbergs

Der 2nd Level Cache ist optional

Muss via Config und Annotations aktiviert werden

Anbindung von Cache Providern via SPI

Page 18: Caching in Hibernate

Konfiguration<property name="cache.provider_class"> org.hibernate.cache.internal.NoCacheProvider</property>

<property name="cache.provider_class"> org.hibernate.cache.ehcache.EhCacheRegionFactory </property>

Page 19: Caching in Hibernate

Entities werden von Hibernate nicht automatisch gecached

Page 20: Caching in Hibernate

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

Page 21: Caching in Hibernate

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; }

Page 22: Caching in Hibernate

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

Page 23: Caching in Hibernate

Cache APIsessionFactory.evict(Person.class, id); sessionFactory.evict(Person.class);

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

sessionFactory.evictCollection(„Person.adressen");

session.setCacheMode(CacheMode.PUT)

Page 24: Caching in Hibernate

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

Page 25: Caching in Hibernate

Code DEMO

Page 26: Caching in Hibernate

Query Cache

Page 27: Caching in Hibernate

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

Page 28: Caching in Hibernate

Konfiguration<property name=„cache.use_query_cache"> true</property>

session.createQuery(…) .setCacheable(true) .setCacheRegion(…)

Page 29: Caching in Hibernate

Michael Plöd Principal Architect @ innoQ

@bitboss

[email protected]

Vielen Dank