SlideShare ist ein Scribd-Unternehmen logo
DB-Caching
                  Optimierung des
                  Datenbankzugriffs


andreas.hubmer@cenarion.com           15.04.2013
Inhalt

Problemstellung
1st-Level Cache
                      JPA
2nd-Level Cache    Hibernate
                    Ehcache
 Query Cache
      Tipps


                               2
Problemstellung

Application-      Application-   Application-
  Server            Server         Server




                      DB




                                                3
Lösung 1: Datenbank skalieren

 Application-   Application-      Application-
   Server         Server            Server




                               • Synchronisation
       DB                DB    • Lizenzen




                                                   4
Lösung 2: Caching

Application-       Application-      Application-
  Server             Server            Server
 DB-Cache           DB-Cache          DB-Cache




                                  • Entlastet DB
                    DB-Server     • Beschleunigt Zugriff




                                                           5
Ziele

• Hohe Cache-Hit-Rate

• Konsistenz

• Self-Management?



                        6
Objekt-Cache
• Objektrelationaler Mapper (ORM)
  – Entity
• Transaktion pro Anwendungsfall
• RAM oder Festplatte
• Wichtig: Jeder DB-Zugriff geht über den
  ORM



                                            7
1st-Level-Cache

         Application Server




Transaktion     1st-Level-Cache   DB-Server




                                              8
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
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
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
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
2nd-Level-Cache

         Application Server



Transaktion      1st-Level

                               2nd-
                              Level   DB-Server
Transaktion      1st-Level
                              Cache

Transaktion      1st-Level




                                                  13
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
2nd-Level-Cache: Konsistenz

Strategien:
• Read-Only
• Nonstrict Read-Write
• Read-Write: ohne serialisierbare
  Transaktionen
• Transaktional: 2PC (teuer)


                                     15
2nd-Level-Cache: Konsistenz


Mehrere Application-Server:
• Synchronisation wie bei verteilter DB
  (außer Read-Only)
• Veraltete Daten, TTL setzen




                                          16
Wie einrichten (JPA)?
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 {
  ….
}



                                                            17
JPA im Rückstand




                   18
Wie einrichten (Hibernate)?
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 {

}


                                                           19
Wie einrichten (Ehcache)?
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>




                                                                 20
Cache API
Cache c = entityManager.getEntityManagerFactory().getCache()




javax.persistence.          evict(clazz)
      Cache




                                                               21
Query Cache

         Application Server



Transaktion      1st-Level     2nd-
                              Level
                              Cache
                                       DB-Server
Transaktion      1st-Level
                              Query-
                              Cache
Transaktion      1st-Level




                                                   22
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
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
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
Beispiel (2)
                      p.setPLZ(‘1040‘)



                             2nd-
                            Level
                  1         Cache
Transaktion   1st-Level                  DB-Server
                            Query-
                            Cache




                                                     26
Beispiel (3)
                          COMMIT


                                       2
                          3    2nd-
                              Level
                 1            Cache
Transaktion   1st-Level                    DB-Server
                              Query-
                              Cache




                                                       27
Query Cache: Config

ehcache.xml

<cache   name="org.hibernate.cache.StandardQueryCache"
         maxElementsInMemory="200"
         … />

<cache   name="org.hibernate.cache.UpdateTimestampsCache"
         maxElementsInMemory="1000"
         eternal="true"
         overflowToDisk="false"/>




                                                            28
Hibernate

• Cache Providers
• Collections (@Cache)
• Regions




                         29
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
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
32
Application Server


            2nd-Level Cache | Query Cache



Application Server                  Sync



  Transaktion        1st-Level    2nd-
                                 Level
                                 Cache
                                            DB-Server
  Transaktion        1st-Level
                                 Query-
                                 Cache
  Transaktion        1st-Level




                                                        33
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
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

Weitere ähnliche Inhalte

Was ist angesagt?

MongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererMongoDB für Java-Programmierer
MongoDB für Java-Programmierer
Uwe Printz
 
Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"schellsoft
 
Elasticsearch & docker mit logstash, jdbc und ruby
Elasticsearch & docker mit logstash, jdbc und rubyElasticsearch & docker mit logstash, jdbc und ruby
Elasticsearch & docker mit logstash, jdbc und ruby
SchanzDieter
 
Metadatenbasierte Validierung
Metadatenbasierte ValidierungMetadatenbasierte Validierung
Metadatenbasierte Validierung
os890
 
JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)
Michael Kurz
 
Auszug Seminarunterlagen "Hibernate 3.x"
Auszug Seminarunterlagen "Hibernate 3.x"Auszug Seminarunterlagen "Hibernate 3.x"
Auszug Seminarunterlagen "Hibernate 3.x"schellsoft
 
Morphia, Spring Data & Co
Morphia, Spring Data & CoMorphia, Spring Data & Co
Morphia, Spring Data & CoTobias Trelle
 
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Michael Kurz
 
SQL Server 2012 070-462 prüfung deutsch
SQL Server 2012 070-462 prüfung deutschSQL Server 2012 070-462 prüfung deutsch
SQL Server 2012 070-462 prüfung deutsch
holgerschmitz2011
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
gedoplan
 
DOAG: NoSQL with MySQL
DOAG: NoSQL with MySQLDOAG: NoSQL with MySQL
DOAG: NoSQL with MySQLFromDual GmbH
 
Entity framework
Entity frameworkEntity framework
Entity framework
Michel Varga
 
Docker Workbench
Docker WorkbenchDocker Workbench
Docker Workbench
Patrick Paechnatz
 
Wie skaliert man Software as a Service Applikationen in der Windows Azure Cloud
Wie skaliert man Software as a Service Applikationen in der Windows Azure CloudWie skaliert man Software as a Service Applikationen in der Windows Azure Cloud
Wie skaliert man Software as a Service Applikationen in der Windows Azure Cloud
Patric Boscolo
 
MySQL Hochverfügbarkeitslösungen
MySQL HochverfügbarkeitslösungenMySQL Hochverfügbarkeitslösungen
MySQL Hochverfügbarkeitslösungen
Lenz Grimmer
 
JBoss AS / EAP Clustering
JBoss AS / EAP  ClusteringJBoss AS / EAP  Clustering
JBoss AS / EAP Clustering
hwilming
 
Internet Briefing 2011: NoSQL with MySQL
Internet Briefing 2011: NoSQL with MySQLInternet Briefing 2011: NoSQL with MySQL
Internet Briefing 2011: NoSQL with MySQLFromDual GmbH
 
Automated Web 2.0 Testing
Automated Web 2.0 TestingAutomated Web 2.0 Testing
Automated Web 2.0 Testing
jlink
 
JBoss EAP clustering
JBoss EAP clustering JBoss EAP clustering
JBoss EAP clustering
hwilming
 
HTML5 Storage
HTML5 StorageHTML5 Storage
HTML5 Storage
adesso AG
 

Was ist angesagt? (20)

MongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererMongoDB für Java-Programmierer
MongoDB für Java-Programmierer
 
Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"Auszug Seminarunterlagen "Tomcat 6.x"
Auszug Seminarunterlagen "Tomcat 6.x"
 
Elasticsearch & docker mit logstash, jdbc und ruby
Elasticsearch & docker mit logstash, jdbc und rubyElasticsearch & docker mit logstash, jdbc und ruby
Elasticsearch & docker mit logstash, jdbc und ruby
 
Metadatenbasierte Validierung
Metadatenbasierte ValidierungMetadatenbasierte Validierung
Metadatenbasierte Validierung
 
JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)
 
Auszug Seminarunterlagen "Hibernate 3.x"
Auszug Seminarunterlagen "Hibernate 3.x"Auszug Seminarunterlagen "Hibernate 3.x"
Auszug Seminarunterlagen "Hibernate 3.x"
 
Morphia, Spring Data & Co
Morphia, Spring Data & CoMorphia, Spring Data & Co
Morphia, Spring Data & Co
 
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
 
SQL Server 2012 070-462 prüfung deutsch
SQL Server 2012 070-462 prüfung deutschSQL Server 2012 070-462 prüfung deutsch
SQL Server 2012 070-462 prüfung deutsch
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
DOAG: NoSQL with MySQL
DOAG: NoSQL with MySQLDOAG: NoSQL with MySQL
DOAG: NoSQL with MySQL
 
Entity framework
Entity frameworkEntity framework
Entity framework
 
Docker Workbench
Docker WorkbenchDocker Workbench
Docker Workbench
 
Wie skaliert man Software as a Service Applikationen in der Windows Azure Cloud
Wie skaliert man Software as a Service Applikationen in der Windows Azure CloudWie skaliert man Software as a Service Applikationen in der Windows Azure Cloud
Wie skaliert man Software as a Service Applikationen in der Windows Azure Cloud
 
MySQL Hochverfügbarkeitslösungen
MySQL HochverfügbarkeitslösungenMySQL Hochverfügbarkeitslösungen
MySQL Hochverfügbarkeitslösungen
 
JBoss AS / EAP Clustering
JBoss AS / EAP  ClusteringJBoss AS / EAP  Clustering
JBoss AS / EAP Clustering
 
Internet Briefing 2011: NoSQL with MySQL
Internet Briefing 2011: NoSQL with MySQLInternet Briefing 2011: NoSQL with MySQL
Internet Briefing 2011: NoSQL with MySQL
 
Automated Web 2.0 Testing
Automated Web 2.0 TestingAutomated Web 2.0 Testing
Automated Web 2.0 Testing
 
JBoss EAP clustering
JBoss EAP clustering JBoss EAP clustering
JBoss EAP clustering
 
HTML5 Storage
HTML5 StorageHTML5 Storage
HTML5 Storage
 

Ähnlich wie Datenbankoptimierung

Title is loading ... Cache is cold.
Title is loading ... Cache is cold.Title is loading ... Cache is cold.
Title is loading ... Cache is cold.
QAware GmbH
 
Oracle Datenbank-Architektur
Oracle Datenbank-ArchitekturOracle Datenbank-Architektur
Oracle Datenbank-Architektur
Markus Flechtner
 
Caching mit Spring Boot - Pain & Gain @ JCON22
Caching mit Spring Boot - Pain & Gain @ JCON22Caching mit Spring Boot - Pain & Gain @ JCON22
Caching mit Spring Boot - Pain & Gain @ JCON22
QAware GmbH
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
Sebastian Springer
 
Überblick Oracle Datenbank Hochverfügbarkeit
Überblick Oracle Datenbank HochverfügbarkeitÜberblick Oracle Datenbank Hochverfügbarkeit
Überblick Oracle Datenbank Hochverfügbarkeit
Ileana Somesan
 
Java EE hochverfügbar
Java EE hochverfügbarJava EE hochverfügbar
Java EE hochverfügbar
gedoplan
 
ShareConf 2014: 10 Gründe warum der SharePoint langsam ist
ShareConf 2014: 10 Gründe warum der SharePoint langsam istShareConf 2014: 10 Gründe warum der SharePoint langsam ist
ShareConf 2014: 10 Gründe warum der SharePoint langsam ist
David Schneider
 
Service Orchestrierung mit Apache Mesos
Service Orchestrierung mit Apache MesosService Orchestrierung mit Apache Mesos
Service Orchestrierung mit Apache Mesos
Ralf Ernst
 
Wordpress on steroids
Wordpress on steroidsWordpress on steroids
Wordpress on steroids
Blogwerk AG
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiChristian Baranowski
 
High Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der CloudHigh Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der CloudAOE
 
Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)Michael Romer
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit Extbase
Stefan Frömken
 
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
AWS Germany
 
PostgreSQL News
PostgreSQL NewsPostgreSQL News
PostgreSQL News
Peter Eisentraut
 
Optimierung von JPA-Anwendungen
Optimierung von JPA-AnwendungenOptimierung von JPA-Anwendungen
Optimierung von JPA-Anwendungen
gedoplan
 
Caching - Hintergründe, Patterns und Best Practices
Caching - Hintergründe, Patterns und Best PracticesCaching - Hintergründe, Patterns und Best Practices
Caching - Hintergründe, Patterns und Best Practices
Michael Plöd
 
Streaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der WahlStreaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der Wahl
Matthias Niehoff
 

Ähnlich wie Datenbankoptimierung (20)

Title is loading ... Cache is cold.
Title is loading ... Cache is cold.Title is loading ... Cache is cold.
Title is loading ... Cache is cold.
 
Oracle Datenbank-Architektur
Oracle Datenbank-ArchitekturOracle Datenbank-Architektur
Oracle Datenbank-Architektur
 
Caching mit Spring Boot - Pain & Gain @ JCON22
Caching mit Spring Boot - Pain & Gain @ JCON22Caching mit Spring Boot - Pain & Gain @ JCON22
Caching mit Spring Boot - Pain & Gain @ JCON22
 
Java Servlets und AJAX
Java Servlets und AJAX Java Servlets und AJAX
Java Servlets und AJAX
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Überblick Oracle Datenbank Hochverfügbarkeit
Überblick Oracle Datenbank HochverfügbarkeitÜberblick Oracle Datenbank Hochverfügbarkeit
Überblick Oracle Datenbank Hochverfügbarkeit
 
Java EE hochverfügbar
Java EE hochverfügbarJava EE hochverfügbar
Java EE hochverfügbar
 
NoSQL with MySQL
NoSQL with MySQLNoSQL with MySQL
NoSQL with MySQL
 
ShareConf 2014: 10 Gründe warum der SharePoint langsam ist
ShareConf 2014: 10 Gründe warum der SharePoint langsam istShareConf 2014: 10 Gründe warum der SharePoint langsam ist
ShareConf 2014: 10 Gründe warum der SharePoint langsam ist
 
Service Orchestrierung mit Apache Mesos
Service Orchestrierung mit Apache MesosService Orchestrierung mit Apache Mesos
Service Orchestrierung mit Apache Mesos
 
Wordpress on steroids
Wordpress on steroidsWordpress on steroids
Wordpress on steroids
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
 
High Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der CloudHigh Performance Multi-Server Magento in der Cloud
High Performance Multi-Server Magento in der Cloud
 
Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit Extbase
 
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
 
PostgreSQL News
PostgreSQL NewsPostgreSQL News
PostgreSQL News
 
Optimierung von JPA-Anwendungen
Optimierung von JPA-AnwendungenOptimierung von JPA-Anwendungen
Optimierung von JPA-Anwendungen
 
Caching - Hintergründe, Patterns und Best Practices
Caching - Hintergründe, Patterns und Best PracticesCaching - Hintergründe, Patterns und Best Practices
Caching - Hintergründe, Patterns und Best Practices
 
Streaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der WahlStreaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der Wahl
 

Datenbankoptimierung

  • 1. DB-Caching Optimierung des Datenbankzugriffs andreas.hubmer@cenarion.com 15.04.2013
  • 2. Inhalt Problemstellung 1st-Level Cache JPA 2nd-Level Cache Hibernate Ehcache Query Cache Tipps 2
  • 3. Problemstellung Application- Application- Application- Server Server Server DB 3
  • 4. Lösung 1: Datenbank skalieren Application- Application- Application- Server Server Server • Synchronisation DB DB • Lizenzen 4
  • 5. Lösung 2: Caching Application- Application- Application- Server Server Server DB-Cache DB-Cache DB-Cache • Entlastet DB DB-Server • Beschleunigt Zugriff 5
  • 6. Ziele • Hohe Cache-Hit-Rate • Konsistenz • Self-Management? 6
  • 7. Objekt-Cache • Objektrelationaler Mapper (ORM) – Entity • Transaktion pro Anwendungsfall • RAM oder Festplatte • Wichtig: Jeder DB-Zugriff geht über den ORM 7
  • 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
  • 13. 2nd-Level-Cache Application Server Transaktion 1st-Level 2nd- Level DB-Server Transaktion 1st-Level Cache Transaktion 1st-Level 13
  • 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
  • 15. 2nd-Level-Cache: Konsistenz Strategien: • Read-Only • Nonstrict Read-Write • Read-Write: ohne serialisierbare Transaktionen • Transaktional: 2PC (teuer) 15
  • 16. 2nd-Level-Cache: Konsistenz Mehrere Application-Server: • Synchronisation wie bei verteilter DB (außer Read-Only) • Veraltete Daten, TTL setzen 16
  • 17. Wie einrichten (JPA)? 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 { …. } 17
  • 19. Wie einrichten (Hibernate)? 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 { } 19
  • 20. Wie einrichten (Ehcache)? 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> 20
  • 21. Cache API Cache c = entityManager.getEntityManagerFactory().getCache() javax.persistence. evict(clazz) Cache 21
  • 22. Query Cache Application Server Transaktion 1st-Level 2nd- Level Cache DB-Server Transaktion 1st-Level Query- Cache Transaktion 1st-Level 22
  • 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
  • 26. Beispiel (2) p.setPLZ(‘1040‘) 2nd- Level 1 Cache Transaktion 1st-Level DB-Server Query- Cache 26
  • 27. Beispiel (3) COMMIT 2 3 2nd- Level 1 Cache Transaktion 1st-Level DB-Server Query- Cache 27
  • 28. Query Cache: Config ehcache.xml <cache name="org.hibernate.cache.StandardQueryCache" maxElementsInMemory="200" … /> <cache name="org.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="1000" eternal="true" overflowToDisk="false"/> 28
  • 29. Hibernate • Cache Providers • Collections (@Cache) • Regions 29
  • 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
  • 32. 32
  • 33. Application Server 2nd-Level Cache | Query Cache Application Server Sync Transaktion 1st-Level 2nd- Level Cache DB-Server Transaktion 1st-Level Query- Cache Transaktion 1st-Level 33
  • 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
  • 35. 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