JPA Caches Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de [email protected] © 2014 Orientation in Objects GmbH Version: 1.0 JPA Caches Der Sprecher Erik Bamberg (OIO) © 2014 Orientation in Objects GmbH JPA Caches 2 1 Caches Aufgaben des Cachings Datenbank entlasten Netzwerk Zugriffe Minimieren Verbessert die Performance Updates und dirty checks Daten • sicherstellen, das Session immer das gleiche geänderte Objekt zurückliefert • Managed Entities © 2014 Orientation in Objects GmbH JPA Caches 3 Anforderungen Eigene Cache Implementierung – welche Anforderungen sind zu berücksichtigen ? © 2014 Orientation in Objects GmbH JPA Caches 4 2 Möglichkeiten von Cache-Implementierungen JTA Transactional Filesystem Cache In Memory Regions Cache Quelle Netzwerk Distributed Cache Instance Off-Heap Cache © 2014 Orientation in Objects GmbH JPA Caches 5 Mehrstufige Caches in O/R-Mappern Agenda für heute Persistence Context Cache Second Level Cache Statement Cache Collection Cache (First Level Cache) • Seit JPA 1.0 • Seit JPA 2.0 • Nicht spec • Nicht spec + Details und Überlegung wie caching verwendet werden sollte © 2014 Orientation in Objects GmbH JPA Caches 6 3 Caching First Level Cache Zugriff entityManager .find(…) Datenbank 1Lvl Cache © 2014 Orientation in Objects GmbH JPA Caches 7 First Level Cache – Cache © 2014 Orientation in Objects GmbH JPA Caches data storage memory find() first level cache find() 8 4 First Level Cache – Dirty Checks find() find() memory Ref @0001 © 2014 Orientation in Objects GmbH data storage change first level cache Ref @0001 JPA Caches 9 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 1Lvl Cache • Cache wird bei close() geleert !!! EntityManager EntityManagerFactory EntityManager 1Lvl Cache © 2014 Orientation in Objects GmbH JPA Caches 10 5 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 © 2014 Orientation in Objects GmbH JPA Caches 11 EntityManager • • • • • EntityManager ist leichtgewichtig kann beliebig erstellt und zerstört werden ist nicht threadsave Mischung zwischen Connection und Transaction First-Level-Cache (Persistence Context) © 2014 Orientation in Objects GmbH JPA Caches 12 6 1Lvl lifecycle entityManagerFactory .createEntityManager() entityManager .close() © 2014 Orientation in Objects GmbH JPA Caches 13 Caching – First Level Cache Object Object Memoryproblem bei vielen Objekten (bulk operations) Object Object Persistence Heap Context (1Lvl) Find() Query EntityManager Object Object Object Heap © 2014 Orientation in Objects GmbH JPA Caches 14 7 EntityManager clear() • Was passiert bei EntityManager.clear() ? EntityManager • Objekte werden detached ! • nicht mehr managed. -> Achtung bei Updates. • kein flush() ! Änderungen gehen verloren Detached • Objekte müssen neu geladen werden -> unterschiedliche Objektinstanz © 2014 Orientation in Objects GmbH JPA Caches 15 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 © 2014 Orientation in Objects GmbH JPA Caches 16 8 Second Level Cache Persistence Context Cache Second Level Cache Statement Cache Collection Cache (First Level Cache) © 2014 Orientation in Objects GmbH JPA Caches 17 Caching – Second Level Cache Zugriff em.find() 1Lvl Cache © 2014 Orientation in Objects GmbH 2nd Level Cache JPA Caches Datenbank 18 9 Caching – Second Level Cache • • • • Applikationsweiter Cache (Persistence-Unit weit) Provider spezifische Implementierung Oft Clusterfähig Evt. Dateiauslagerung 1Lvl Cache EntityManager 2nd Level Cache Datenbank EntityManager 1Lvl Cache © 2014 Orientation in Objects GmbH Filesystem JPA Caches 19 JTA Transactional Second Level Cache bietet die klassischen Cache Funktionen Filesystem Cache In Memory Regions Cache Off-Heap Cache © 2014 Orientation in Objects GmbH JPA Caches Quelle Netzwerk Distributed Cache Instance 20 10 Second Level Cache bietet die klassischen Cache Funktionen JTA Transactional Filesystem Cache Quelle In Memory Regions Cache Distributed Cache Instance Off-Heap Cache © 2014 Orientation in Objects GmbH Netzwerk JPA Caches 21 2Lvl lifecycle Persistence. createEntityManagerFactory(„myUnit"); EntityManager © 2014 Orientation in Objects GmbH EntityManager entityManagerFactory .close() EntityManager JPA Caches 22 11 Shared Cache Mode einschalten persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1 > <persistence-unit name="JDBPERF"> <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> </persistence-unit> </persistence> Werte: • ALL • ENABLE_SELECTIVE • DISABLE_SELECTIVE • NONE • UNSPECIFIED © 2014 Orientation in Objects GmbH JPA Caches 23 Selectiver Second Level Cache verwenden @Entity @Cacheable(true) public class Country { … } Zusammen mit: • ENABLE_SELECTIVE • DISABLE_SELECTIVE © 2014 Orientation in Objects GmbH JPA Caches 24 12 Eine kleine Beispiel Entität @Entity @Cacheable public class Person { @Id 2 EntityManager private long- id; - Calls nacheinander @OneToMany - Second Level Cache Aktiv (cascade=CascadeType.ALL, ,fetch=FetchType.LAZY) private List<Child> children; …… } © 2014 Orientation in Objects GmbH JPA Caches 25 Quizstunde Person p=entityManager.find(Person.class, 1L); Person p2=entityManager2.find(Person.class, 1L); Wieviele SQL Queries ? 3 2 © 2014 Orientation in Objects GmbH 1 Was ist SQL ? JPA Caches 26 13 Quizstunde 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 © 2014 Orientation in Objects GmbH JPA Caches 27 Quizstunde 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 2 © 2014 Orientation in Objects GmbH 1 Bei Hardwarepreisen egal JPA Caches 28 14 Quizstunde 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 © 2014 Orientation in Objects GmbH JPA Caches 29 Statementcache Persistence Context Cache Second Level Cache Statement Cache Collection Cache (First Level Cache) © 2014 Orientation in Objects GmbH JPA Caches 30 15 Caching – Query Cache • • • • Das Ergebnis von Queries wird gecached Queries werden nur einmalig ausgeführt Key ist Statement+Parameter Nur ID‘s werden gecachted 2nd Level Cache Application /EntityManager © 2014 Orientation in Objects GmbH ResultSet (ID’s) Query Cache „Select o from Order where ordernr=:nr“ :nr=‚4711‘ Datenbank JPA Caches 31 Query Cache aktivieren Query query=em. createQuery("from Country c where c.iso='DE'"); query.setHint("org.hibernate.cacheable", true); Country germany=query.getSingleResult(); © 2014 Orientation in Objects GmbH JPA Caches 32 16 Collection Cache Persistence Context Cache Second Level Cache Statement Cache Collection Cache (First Level Cache) © 2014 Orientation in Objects GmbH JPA Caches 33 Collection Caches Hibernate stellt zusätzlich Collection Cache zur Verfügung @Cache (usage=CacheConcurrencyStrategy.TRANSACTIONAL) @OneToMany(mappedBy="customer", fetch=FetchType.EAGER, cascade=CascadeType.ALL) private Set members; • Relationships Caching • Caching im Second Level Cache • Ähnlich dem Query cache werden nur ID‘s gecachted © 2014 Orientation in Objects GmbH JPA Caches 34 17 Cache nochmal zurück…. Noch ein paar Details Persistence Context Cache Second Level Cache Statement Cache Collection Cache (First Level Cache) + Details und Überlegung wie caching verwendet werden sollte © 2014 Orientation in Objects GmbH JPA Caches 35 Möglichst alles Cachen ? Möglichst alle Objekte Cachen für beste Performance ? © 2014 Orientation in Objects GmbH JPA Caches 36 18 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 Fazit: Cache-Verwendung sollte geplant sein !! © 2014 Orientation in Objects GmbH JPA Caches 37 Caching – Second Level Cache – Was cachen ? sollte ich nicht cachen sollte ich cachen Land Order orderStatus • Daten welche sich häufig ändern • Entitäten welche von unterschiedlichen Knoten geschrieben werden •Konstante Werte •Selten veränderliche Werte •Werte welche regelmäßig gelesen werden Daten welche nur von dieser Applikation geändert werden Invoice (1999-2011) •Daten welche nur sehr selten gelesen werden © 2014 Orientation in Objects GmbH JPA Caches 38 19 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 Query query=em.createQuery("from Country c where c.iso='DE'"); query.setHint(QueryHints.CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS); query.getResultList(); © 2014 Orientation in Objects GmbH JPA Caches 39 Was brauche ich zum Cachen ? •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 © 2014 Orientation in Objects GmbH JPA Caches 40 20 Mission erfüllt © 2014 Orientation in Objects GmbH JPA Caches 41 ? ? ? ? ? ? ? ? Fragen ? Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de [email protected] © 2014 Orientation in Objects GmbH JPA Caches 21 Vielen Dank für ihre Aufmerksamkeit ! Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de [email protected] © 2014 Orientation in Objects GmbH JPA Caches Manuelle Cache-Controlle Cache cache=entityManagerFactory.getCache(); cache.contains(myClass.class,myObject); cache.evict(myClass.class,myObject); cache.evict(myClass.class); cache.evictAll(); © 2014 Orientation in Objects GmbH JPA Caches 44 22