1
JPA Caches© 2014 Orientation in Objects GmbH
Orientation in Objects GmbH
Weinheimer Str. 6868309 Mannheim
Version:
JPA Caches
1.0
JPA Caches© 2014 Orientation in Objects GmbH
Der Sprecher
Erik Bamberg (OIO)
2
2
JPA Caches© 2014 Orientation in Objects GmbH
Caches
3
Aufgaben des Cachings
Datenbank entlastenNetzwerk Zugriffe Minimieren
Verbessert die Performance
Updates und dirty checks
• sicherstellen, das Session immer das gleiche geänderte Objekt zurückliefert• Managed Entities
DatenDaten
JPA Caches© 2014 Orientation in Objects GmbH
Anforderungen
4
Eigene Cache Implementierung – welche Anforderungen sind zu berücksichtigen ?
3
JPA Caches© 2014 Orientation in Objects GmbH
Möglichkeiten von Cache-Implementierungen
5
Quelle
In Memory Cache
Filesystem Cache
Off-Heap Cache
NetzwerkNetzwerkRegionsDistributed
CacheInstance
JTA
Tra
nsac
tiona
l
JPA Caches© 2014 Orientation in Objects GmbH
Mehrstufige Caches in O/R-MappernAgenda für heute
6
Persistence ContextCache(First Level Cache)
Second Level Cache
Statement Cache
CollectionCache
• Seit JPA 1.0 • Seit JPA 2.0 • Nicht spec • Nicht spec
+ Details und Überlegung wie caching verwendet werden sollte
4
JPA Caches© 2014 Orientation in Objects GmbH
Caching First Level Cache Zugriff
7
1Lvl Cache Datenbank
entityManager.find(…)
JPA Caches© 2014 Orientation in Objects GmbH
mem
ory
First Level Cache – Cache
8
data
stor
age
first
leve
lcac
he
find()
find()
5
JPA Caches© 2014 Orientation in Objects GmbH
mem
ory
First Level Cache – Dirty Checks
9
data
stor
age
first
leve
lcac
he
find()
change
find()
Ref @0001
Ref @0001
JPA Caches© 2014 Orientation in Objects GmbH
Caching – First Level Cache
• Entity Manager Cached in der Session geladene Objekte
• Die Entity Manager Instanzen bilden einen First Level Cache
• Persistence Context = 1st Lvl Cache
• Objekte werden nur einmal geladen
• Immer aktiv
• Cache wird bei close() geleert !!!
10
EntityM
anagerFactory
EntityManager
EntityManager
1Lvl Cache
1Lvl Cache
6
JPA Caches© 2014 Orientation in Objects GmbH
EntityManagerFactory
• Gibt EntityManager zurück
• Wird über verschiedene Threads geshared (ist threadsafe)
• Normalerweise eine EntityManagerFactory pro Anwendung
• Pro DB eine EntityManagerFactory (bei mehreren Datenbanken)
• Cache (providerabhängig)– generierte SQL-Statements – 2nd Level Cache
11
JPA Caches© 2014 Orientation in Objects GmbH
EntityManager
• EntityManager ist leichtgewichtig• kann beliebig erstellt und zerstört werden
• ist nicht threadsave• Mischung zwischen Connection und Transaction
• First-Level-Cache (Persistence Context)
12
7
JPA Caches© 2014 Orientation in Objects GmbH
1Lvl lifecycle
13
entityManagerFactory.createEntityManager()
entityManager.close()
JPA Caches© 2014 Orientation in Objects GmbH
Caching – First Level Cache
14
EntityManagerHeapHeap
Object
Object
Object
Object
Object
Object
Object
Heap
PersistenceContext (1Lvl)
Find()Query
Memoryproblem bei vielen Objekten(bulk operations)
8
JPA Caches© 2014 Orientation in Objects GmbH
EntityManager clear()
• Was passiert bei EntityManager.clear() ?
15
EntityManager
Detached
• Objekte werden detached !• nicht mehr managed.
-> Achtung bei Updates.• kein flush() ! Änderungen gehen verloren
• Objekte müssen neu geladen werden-> unterschiedliche Objektinstanz
JPA Caches© 2014 Orientation in Objects GmbH
Fazit 1Level
Persistence Context Cache (1stLevel Cache)
• Für die Dauer einer EntityManager Session/Transaction (z.B: Request)
• nicht shared zwischen EntityManager
• VM-Heap
• Immer verfügbar und aktiv
16
9
JPA Caches© 2014 Orientation in Objects GmbH
Second Level Cache
17
Persistence ContextCache(First Level Cache)
Second Level Cache
Statement Cache
CollectionCache
JPA Caches© 2014 Orientation in Objects GmbH
Caching – Second Level Cache Zugriff
18
1Lvl Cache 2nd Level Cache Datenbank
em.find()
10
JPA Caches© 2014 Orientation in Objects GmbH
Caching – Second Level Cache
19
EntityManager
EntityManager
1Lvl Cache
1Lvl Cache
• Applikationsweiter Cache (Persistence-Unit weit)
• Provider spezifische Implementierung
• Oft Clusterfähig
• Evt. Dateiauslagerung
2nd Level Cache
Datenbank
Filesystem
JPA Caches© 2014 Orientation in Objects GmbH
Second Level Cache bietet die klassischen Cache Funktionen
20
Quelle
In Memory Cache
Filesystem Cache
Off-Heap Cache
NetzwerkNetzwerkRegionsDistributed
CacheInstance
JTA
Tra
nsac
tiona
l
11
JPA Caches© 2014 Orientation in Objects GmbH
Second Level Cache bietet die klassischen Cache Funktionen
21
QuelleQuelle
In Memory Cache
In Memory Cache
Filesystem Cache
Off-Heap Cache
NetzwerkNetzwerkRegionsDistributed
CacheInstance
DistributedCache
Instance
JTA
Tra
nsac
tiona
l
JPA Caches© 2014 Orientation in Objects GmbH
2Lvl lifecycle
22
Persistence.createEntityManagerFactory(„myUnit");
entityManagerFactory.close()EntityManager EntityManager EntityManager
12
JPA Caches© 2014 Orientation in Objects GmbH
Shared Cache Mode einschalten
persistence.xml
13
JPA Caches© 2014 Orientation in Objects GmbH
Eine kleine Beispiel Entität
@Entity
@Cacheable
public class Person {
@Id
private long id;
@OneToMany(cascade=CascadeType. ALL,,fetch=FetchType. LAZY)
private List children;
……
}
25
- 2 EntityManager- Calls nacheinander- Second Level Cache Aktiv
- 2 EntityManager- Calls nacheinander- Second Level Cache Aktiv
JPA Caches© 2014 Orientation in Objects GmbH
Quizstunde
26
Wieviele SQL Queries ?
3 1
2 Was ist SQL ?
Person p=entityManager.find(Person.class, 1L);Person p2=entityManager2.find(Person.class, 1L);
14
JPA Caches© 2014 Orientation in Objects GmbH
Quizstunde
27
entityManager.createQuery("select p from Person p where p.id=1",Person. class).getSingleResult();
entityManager2.find(Person. class, 1L);
Wieviele SQL Queries ?
3 1
2 Keine Ahnung
JPA Caches© 2014 Orientation in Objects GmbH
Quizstunde
28
entityManager.createQuery("select p from Person p where p.id=1",Person. class).getSingleResult();entityManager2.createQuery("select p from Person p where p.id=1",Person. class).getSingleResult();
Wieviele SQL Queries ?
4 1
2 Bei Hardwarepreisen egal
15
JPA Caches© 2014 Orientation in Objects GmbH
Quizstunde
29
Person p=entityManager.find(Person.class, 1L);p.getChildren().size();Person p2=entityManager2.find(Person.class, 1L);p2.getChildren().size();
Wieviele SQL Queries ?
3 1
2 4
JPA Caches© 2014 Orientation in Objects GmbH
Statementcache
30
Persistence ContextCache(First Level Cache)
Second Level Cache
Statement Cache
CollectionCache
16
JPA Caches© 2014 Orientation in Objects GmbH
Caching – Query Cache
• Das Ergebnis von Queries wird gecached
• Queries werden nur einmalig ausgeführt
• Key ist Statement+Parameter
• Nur ID‘s werden gecachted
31
Application /EntityManager
„Select o from Order where ordernr=:nr“:nr=‚4711‘
2nd Level Cache2nd Level Cache
Datenbank
Query C
ache
ResultSet(ID’s)
JPA Caches© 2014 Orientation in Objects GmbH
Query Cache aktivieren
Query query=em.
createQuery("from Country c where c.iso='DE'");
query.setHint("org.hibernate.cacheable", true);
Country germany=query.getSingleResult();
32
17
JPA Caches© 2014 Orientation in Objects GmbH
Collection Cache
33
Persistence ContextCache(First Level Cache)
Second Level Cache
Statement Cache
CollectionCache
JPA Caches© 2014 Orientation in Objects GmbH
Collection Caches
@Cache (usage=CacheConcurrencyStrategy.TRANSACTIONA L)
@OneToMany(mappedBy="customer", fetch=FetchType.EAG ER, cascade=CascadeType.ALL)
private Set members;
34
• Relationships Caching • Caching im Second Level Cache• Ähnlich dem Query cache werden nur ID‘s gecachted
Hibernate stellt zusätzlich Collection Cache zur Verfügung
18
JPA Caches© 2014 Orientation in Objects GmbH
Cache
35
Persistence ContextCache(First Level Cache)
Second Level Cache
Statement Cache
CollectionCache
nochmal zurück…. Noch ein paar Details
+ Details und Überlegung wie caching verwendet werden sollte
JPA Caches© 2014 Orientation in Objects GmbH
Möglichst alles Cachen ?
36
Möglichst alle Objekte Cachenfür beste Performance ?
19
JPA Caches© 2014 Orientation in Objects GmbH
Probleme beim Cachen
• Probleme mit Heap-Speicher/Garbage Collector bei großen Caches
• Verwaltungsaufwand der Caches• nachschlagen im Cache für Objekte die sowieso meist veraltert sind.
• Stale Object Gefahr
• Synchronisationsoverhead im Clusterbetrieb
• Höhere Software Fehlerrate bei verteilten Systemen
37
Fazit: Cache-Verwendung sollte geplant sein !!
JPA Caches© 2014 Orientation in Objects GmbH
Caching – Second Level Cache – Was cachen ?
38
LandOrder
orderStatus
Invoice (1999-2011)
•Konstante Werte•Selten veränderliche Werte•Werte welche regelmäßig gelesen werden
Daten welche nur von dieser Applikation geändert werden• Daten welche sich häufig ändern
• Entitäten welche von unterschiedlichen Knoten geschrieben werden
•Daten welche nur sehr selten gelesen werden
sollte ich cachensollte ich nicht cachen
20
JPA Caches© 2014 Orientation in Objects GmbH
Cache Query Hints
• javax.persistence.cache.retrieveMode– Steuert den Zugriff auf die Objekte im Cache
• BYPASS– Ignoriere Objekte im Shared Cache
• USE– Benutze Objekte im Shared Cache, ignoriere Daten aus DB ResultSet
• javax.persistence.cache.storeMode– Steuert wie der Cache nach Query modifiziert wird
• BYPASS– Aus DB geladenes Objekt nicht in den Cache
• REFRESH– Aus DB geladenes Objekt ersetzt das Object im Cache
• USE– Wenn Object nicht im Cache, dann lade von DB und setze in Cache
39
Query query=em.createQuery("from Country c where c. iso='DE'");query.setHint( QueryHints.CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS);query.getResultList();
JPA Caches© 2014 Orientation in Objects GmbH
Was brauche ich zum Cachen ?
40
•1st Lvl. • integriert in JPA Provider
•2nd Lvl• evt. Cache Implementierung
(ehcache,infinispan ect.)• Konfiguration in persistence.xml/Cache Annotations
•Query Cache• 2nd LvlCache•Implementierung bei Query
21
JPA Caches© 2014 Orientation in Objects GmbH
Mission erfüllt
41
JPA Caches© 2014 Orientation in Objects GmbH
?? ??
??Fragen ?Orientation in Objects GmbH
Weinheimer Str. 6868309 Mannheim
? ?
22
JPA Caches© 2014 Orientation in Objects GmbH
Vielen Dank für ihre Aufmerksamkeit !
Orientation in Objects GmbH
Weinheimer Str. 6868309 Mannheim
JPA Caches© 2014 Orientation in Objects GmbH
Manuelle Cache-Controlle
Cache cache=entityManagerFactory.getCache();
cache.contains(myClass.class,myObject);
cache.evict(myClass.class,myObject);
cache.evict(myClass.class);
cache.evictAll();
44