Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de info@oio.de Version: 2014 Orientation 1.0 in Objects GmbH Der Sprecher Erik Bamberg (OIO) 2 1
s 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 3 Anforderungen Eigene Implementierung welche Anforderungen sind zu berücksichtigen? 4 2
Möglichkeiten von -Implementierungen JTA Transactional Filesystem In Memory Off-Heap Regions Netzwerk Quelle Distributed Instance 5 Mehrstufige s in O/R-Mappern Agenda für heute Persistence Context (First Level ) Second Level Statement Collection Seit JPA 1.0 Seit JPA 2.0 Nicht spec Nicht spec + Details und Überlegung wie caching verwendet werden sollte 6 3
Caching First Level Zugriff entitymanager.find( ) 1Lvl Datenbank 7 First Level find() memory find() first level cache data storage 8 4
First Level Dirty Checks find() Ref @0001 Ref @0001 memory change find() first level cache data storage 9 Caching First Level Entity Manager d in der Session geladene Objekte Die Entity Manager Instanzen bilden einen First Level Persistence Context = 1st Lvl Objekte werden nur einmal geladen Immer aktiv EntityManager wird bei close() geleert!!! 1Lvl EntityManager 1Lvl EntityManagerFactory 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) (providerabhängig) generierte SQL-Statements 2nd Level 11 EntityManager EntityManager ist leichtgewichtig kann beliebig erstellt und zerstört werden ist nicht threadsave Mischung zwischen Connection und Transaction First-Level- (Persistence Context) 12 6
1Lvl lifecycle entitymanagerfactory.createentitymanager() entitymanager.close() 13 Caching First Level Object Object Object Object Persistence Heap Context (1Lvl) Object Object Object Memoryproblem bei vielen Objekten (bulk operations) Find() Query EntityManager Heap 14 7
EntityManager clear() Was passiert bei EntityManager.clear()? Objekte werden detached! nicht mehr managed. -> Achtung bei Updates. kein flush()! Änderungen gehen verloren EntityManager Detached Objekte müssen neu geladen werden -> unterschiedliche Objektinstanz 15 Fazit 1Level Persistence Context (1stLevel ) Für die Dauer einer EntityManager Session/Transaction (z.b: Request) nicht shared zwischen EntityManager VM-Heap Immer verfügbar und aktiv 16 8
Second Level Persistence Context (First Level ) Second Level Statement Collection 17 Caching Second Level Zugriff em.find() 1Lvl 2nd Level Datenbank 18 9
Caching Second Level Applikationsweiter (Persistence-Unit weit) Provider spezifische Implementierung Oft Clusterfähig Evt. Dateiauslagerung 1Lvl EntityManager EntityManager 1Lvl 2nd Level Filesystem Datenbank 19 Second Level bietet die klassischen Funktionen JTA Transactional Filesystem In Memory Off-Heap Regions Netzwerk Quelle Distributed Instance 20 10
Second Level bietet die klassischen Funktionen JTA Transactional Filesystem In Memory Off-Heap Regions Netzwerk Quelle Distributed Instance 21 2Lvl lifecycle Persistence. createentitymanagerfactory( myunit"); entitymanagerfactory.close() EntityManager EntityManager EntityManager 22 11
Shared 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 23 Selectiver Second Level verwenden @Entity @able(true) public class Country { } Zusammen mit: ENABLE_SELECTIVE DISABLE_SELECTIVE 24 12
Eine kleine Beispiel Entität @Entity @able public class Person { @Id private long id; - 2 EntityManager - Calls nacheinander - Second Level Aktiv @OneToMany (cascade=cascadetype.all,,fetch=fetchtype.lazy) private List<Child> children; } 25 Quizstunde Person p=entitymanager.find(person.class, 1L); Person p2=entitymanager2.find(person.class, 1L); Wieviele SQL Queries? 3 1 2 Was ist SQL? 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 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 1 2 Bei Hardwarepreisen egal 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 29 Statementcache Persistence Context (First Level ) Second Level Statement Collection 30 15
Caching Query Das Ergebnis von Queries wird gecached Queries werden nur einmalig ausgeführt Key ist Statement+Parameter Nur ID s werden gecachted 2nd Level Application /EntityManager Select o from Order where ordernr=:nr :nr= 4711 ResultSet (ID s) Query Datenbank 31 Query aktivieren Query query=em. createquery("from Country c where c.iso='de'"); query.sethint("org.hibernate.cacheable", true); Country germany=query.getsingleresult(); 32 16
Collection Persistence Context (First Level ) Second Level Statement Collection 33 Collection s Hibernate stellt zusätzlich Collection zur Verfügung @ (usage=concurrencystrategy.transactional) @OneToMany(mappedBy="customer", fetch=fetchtype.eager, cascade=cascadetype.all) private Set members; Relationships Caching Caching im Second Level Ähnlich dem Query cache werden nur ID s gecachted 34 17
nochmal zurück. Noch ein paar Details Persistence Context (First Level ) Second Level Statement Collection + Details und Überlegung wie caching verwendet werden sollte 35 Möglichst alles n? Möglichst alle Objekte n für beste Performance? 36 18
Probleme beim n Probleme mit Heap-Speicher/Garbage Collector bei großen s Verwaltungsaufwand der s nachschlagen im für Objekte die sowieso meist veraltert sind. Stale Object Gefahr Synchronisationsoverhead im Clusterbetrieb Höhere Software Fehlerrate bei verteilten Systemen Fazit: -Verwendung sollte geplant sein!! 37 Caching Second Level Was cachen? sollte ich nicht cachen Order orderstatus Daten welche sich häufig ändern Entitäten welche von unterschiedlichen Knoten geschrieben werden sollte ich cachen Land Daten welche nur von dieser Applikation geändert werden Konstante Werte Selten veränderliche Werte Werte welche regelmäßig gelesen werden Invoice (1999-2011) Daten welche nur sehr selten gelesen werden 38 19
Query Hints javax.persistence.cache.retrievemode Steuert den Zugriff auf die Objekte im BYPASS Ignoriere Objekte im Shared USE Benutze Objekte im Shared, ignoriere Daten aus DB ResultSet javax.persistence.cache.storemode Steuert wie der nach Query modifiziert wird BYPASS Aus DB geladenes Objekt nicht in den REFRESH Aus DB geladenes Objekt ersetzt das Object im USE Wenn Object nicht im, dann lade von DB und setze in Query query=em.createquery("from Country c where c.iso='de'"); query.sethint(queryhints.cache_retrieve_mode, RetrieveMode.BYPASS); query.getresultlist(); 39 Was brauche ich zum n? 1st Lvl. integriert in JPA Provider 2nd Lvl evt. Implementierung (ehcache,infinispan ect.) Konfiguration in persistence.xml/ Annotations Query 2nd Lvl Implementierung bei Query 40 20
Mission erfüllt 41? www.oio.de info@oio.de??? Fragen??? Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim 21
Vielen Dank für ihre Aufmerksamkeit! Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de info@oio.de Manuelle -Controlle cache=entitymanagerfactory.get(); cache.contains(myclass.class,myobject); cache.evict(myclass.class,myobject); cache.evict(myclass.class); cache.evictall(); 44 22