Präsentation zum Thema Datenbankoptimierung: Effektiver Einsatz von EHCache, etc. "Ein typisches Szenario bei Enterprise-Applications ist folgendes: mehrere Application-Server greifen auf eine Datenbank zu. Schnell wird dabei der Zugriff auf die Datenbank zum Performance-Engpass. Im Vortrag wird das Caching von Query-Ergebnissen auf den Application-Servern mit Hilfe der JPA erklärt."
8. 1st-Level-Cache
Application Server
Transaktion 1st-Level-Cache DB-Server
8
9. 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
10. 1st-Level-Cache: Beispiel
Applikations-Code Was tatsächlich geschieht
BEGIN TX BEGIN TX
SELECT p FROM person AS p p = SELECT * FROM person
WHERE p.id=1 WHERE id=1
personCache.put(1, p)
SELECT p FROM person AS p personCache.get(1)
WHERE p.id=1
p.setFirma(“Cenarion“)
END TX UPDATE person SET firma=…
END TX
10
11. 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
12. 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
14. 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
23. Query Cache
• ID notwendig für 1st/2nd Level Cache
SELECT … WHERE nonId=‘value‘
• Schlüssel: Query
• Werte: Objekt-IDs
– Mit diesen wird der 1st/2nd-Level-Cache
befragt
23
24. 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
25. Beispiel (1)
SELECT p FROM Person p WHERE plz=‘1041 ‘
4
3 2nd-
Level
2 Cache
Transaktion 1st-Level DB-Server
Query-
Cache
1
25
30. 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
31. 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
34. 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