Datenbankoptimierung
-
Upload
cenarion-information-systems-gmbh -
Category
Technology
-
view
907 -
download
0
description
Transcript of Datenbankoptimierung
![Page 2: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/2.jpg)
Inhalt
Problemstellung
1st-Level Cache
2nd-Level Cache
Query Cache
Tipps
2
JPA Hibernate Ehcache
![Page 3: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/3.jpg)
Problemstellung
3
DB
Application- Server
Application- Server
Application- Server
DB
![Page 4: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/4.jpg)
Lösung 1: Datenbank skalieren
4
DB
Application- Server
Application- Server
Application- Server
DB • Synchronisation • Lizenzen
![Page 5: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/5.jpg)
DB-Cache
DB-Cache
DB-Cache
Lösung 2: Caching
5
DB-Server
Application- Server
Application- Server
Application- Server
• Entlastet DB • Beschleunigt Zugriff
![Page 6: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/6.jpg)
Ziele
• Hohe Cache-Hit-Rate
• Konsistenz
• Self-Management?
6
![Page 7: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/7.jpg)
Objekt-Cache
• Objektrelationaler Mapper (ORM)
– Entity
• Transaktion pro Anwendungsfall
• RAM oder Festplatte
• Wichtig: Jeder DB-Zugriff geht über den
ORM
7
![Page 8: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/8.jpg)
1st-Level-Cache
8
DB-Server
Application Server
Transaktion 1st-Level-Cache
![Page 9: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/9.jpg)
1st-Level-Cache
• Hash-Tabelle pro Entity-Klasse
• Schlüssel: Objekt-ID = Primary Keys
• Werte: Objektinstanzen
• Im Rahmen einer Transaktion
– Kein Synchronisationsbedarf zu anderen
Application-Servern
9
![Page 10: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/10.jpg)
1st-Level-Cache: Beispiel Applikations-Code
BEGIN TX
SELECT p FROM person AS p
WHERE p.id=1
SELECT p FROM person AS p
WHERE p.id=1
p.setFirma(“Cenarion“)
END TX
10
Was tatsächlich geschieht
BEGIN TX
p = SELECT * FROM person
WHERE id=1
personCache.put(1, p)
personCache.get(1)
UPDATE person SET firma=…
END TX
![Page 11: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/11.jpg)
Puffer für Schreibzugriffe
• Update, Insert, Delete erst mit
Transaktionsende
• Ausnahmen:
– Manueller Flush
– Objekt vom Typ A wurde verändert: Vor einer
DB-Query über A müssen die Änderungen an
A persistiert werden
11
![Page 12: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/12.jpg)
Mit der JPA
@Stateless
public class MyEjb {
@PersistenceContext
private EntityManager entityManager;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void businessMethod() throws Exception {
Person p = entityManager.find(Person.class, 1);
p.setFirma(“Cenarion“);
}
}
12
![Page 13: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/13.jpg)
2nd-Level-Cache
13
DB-Server
Application Server
Transaktion
2nd- Level Cache
1st-Level
Transaktion 1st-Level
Transaktion 1st-Level
![Page 14: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/14.jpg)
2nd-Level-Cache
• Pro Application Server einer
– für alle Transaktionen gemeinsam
• Cache über Objekt-Ids
• Werte statt Objekte
• Wird befüllt beim Lesen (SELECT) und
Commit (UPDATE, INSERT, DELETE)
14
![Page 15: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/15.jpg)
2nd-Level-Cache: Konsistenz
Strategien:
• Read-Only
• Nonstrict Read-Write
• Read-Write: ohne serialisierbare
Transaktionen
• Transaktional: 2PC (teuer)
15
![Page 16: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/16.jpg)
2nd-Level-Cache: Konsistenz
Mehrere Application-Server:
• Synchronisation wie bei verteilter DB
(außer Read-Only)
• Veraltete Daten, TTL setzen
16
![Page 17: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/17.jpg)
Wie einrichten (JPA)?
17
persistence.xml <persistence-unit name="myUnit" transaction-type="JTA"> … <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> <!– NONE, DISABLE_SELECTIVE --> </persistence-unit>
@javax.persistence.Entity
@javax.persistence.Cacheable(true)
public class Person {
….
}
![Page 18: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/18.jpg)
JPA im Rückstand
18
![Page 19: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/19.jpg)
Wie einrichten (Hibernate)?
19
persistence.xml … <property name="hibernate.cache.use_second_level_cache" value="true" /> <property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.EhCacheRegionFactory" />
@javax.persistence.Entity
@org.hibernate.annotations.Cache(usage=
CacheConcurrencyStrategy.READ_WRITE)
public class Person {
}
![Page 20: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/20.jpg)
Wie einrichten (Ehcache)?
20
ehcache.xml <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd" updateCheck="false"> <cache name="com.cenarion.Person" maxElementsInMemory="200" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="3600" overflowToDisk="false" /> </ehcache>
![Page 21: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/21.jpg)
Cache API
21
javax.persistence. Cache
evict(clazz)
Cache c = entityManager.getEntityManagerFactory().getCache()
![Page 22: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/22.jpg)
Query Cache
22
DB-Server
Application Server
Transaktion
2nd- Level Cache
Query-Cache
1st-Level
Transaktion 1st-Level
Transaktion 1st-Level
![Page 23: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/23.jpg)
Query Cache
• ID notwendig für 1st/2nd Level Cache
• Schlüssel: Query
• Werte: Objekt-IDs
– Mit diesen wird der 1st/2nd-Level-Cache
befragt
23
SELECT … WHERE nonId=‘value‘
![Page 24: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/24.jpg)
Query Cache: Konsistenz
• Bei Änderungen an einer Tabelle A werden
alle gecachten Ergebnisse für Queries über A ungültig
• Mittels Timestamp
– Timestamp pro Tabelle und gecachter Query
– Locking notwendig
• Synchronisation der Tabellen-Timestamps
24
![Page 25: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/25.jpg)
Beispiel (1)
25
SELECT p FROM Person p WHERE plz=‘1041 ‘
DB-Server
2nd- Level Cache
Query-Cache
Transaktion 1st-Level
1
2
3 4
![Page 26: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/26.jpg)
Beispiel (2)
26
p.setPLZ(‘1040‘)
DB-Server
2nd- Level Cache
Query-Cache
Transaktion 1st-Level
1
![Page 27: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/27.jpg)
Beispiel (3)
27
COMMIT
DB-Server
2nd- Level Cache
Query-Cache
Transaktion 1st-Level
2 3
1
![Page 28: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/28.jpg)
Query Cache: Config
28
ehcache.xml <cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="200" … /> <cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="1000" eternal="true" overflowToDisk="false"/>
![Page 29: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/29.jpg)
Hibernate
• Cache Providers
• Collections (@Cache)
• Regions
29
![Page 30: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/30.jpg)
Verwendungstipps (1)
• Zuerst andere Optimierungen (zB: Indizes)
• 1st-Level-Cache ist immer aktiv
• 2nd-Level-Cache:
– Wenn viele Lesezugriffe vorkommen
– Veraltete Daten ohne
Transaktionsunterstützung kein Problem
– Pro Entity entscheiden
– Performance messen (#Hits, Beschleunigung,
Speicherbedarf, DB-Entlastung)
30
![Page 31: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/31.jpg)
Verwendungstipps (2)
• Query-Cache:
– Für einzelne Queries per Hint aktivieren
– Nur mit 2nd-Level-Cache gemeinsam
– Tabellen mit (fast) nur Lesezugriff
– Bei natürlichen Schlüsseln (≠Primärschlüssel)
• Keine direkten DB-Manipulationen per
SQL/Native Query
31
![Page 32: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/32.jpg)
32
![Page 33: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/33.jpg)
33
DB-Server
Transaktion
2nd- Level Cache
Query-Cache
1st-Level
Transaktion 1st-Level
Transaktion 1st-Level
2nd-Level Cache | Query Cache
Sync
Application Server
Application Server
![Page 34: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/34.jpg)
Zusammenfassung
• Problem: DB-Überlastung
• Lösung: Caching am Application-Server
• Herausforderung Synchronisierung
– Caching besonders sinnvoll bei weniger
strikten Anforderungen
• Self-Management ist eine Vision
34
![Page 35: Datenbankoptimierung](https://reader033.fdocuments.in/reader033/viewer/2022060200/5598ba2b1a28abc64a8b4681/html5/thumbnails/35.jpg)
Links
• JPA offiziell: http://docs.oracle.com/javaee/6/tutorial/doc/bnbpy.html
• JPA Tutorial: http://en.wikibooks.org/wiki/Java_Persistence
• JPA: https://blogs.oracle.com/carolmcdonald/entry/jpa_caching
• Hibernate: http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/performance.html
• Hibernate, alt, aber gut: http://www.javalobby.org/java/forums/t48846.html
35