Donnerstag, 8. März 2012

Caching via Hibernate JPA

JPA Caching

Um eine bestehende Applikation zu optimieren, bietet es sich an, dass man Katalogdaten bzw. Stammdaten cacht. In Abgrenzung zu Bewegungsdaten, die sich auf bestimmte Vorgänge beziehen und nur punktuell benötigt werden, werden Stammdaten in jedem Prozess/Vorgang benötigt unabhängig vom konkreten Geschäftsvorfall.
Somit bietet es sich an solche Daten als Kandidaten fürs Cachen vorzusehen.
Sogenannte Schlüsseldaten oder Katalogdaten kennzeichnen sich dadurch aus, dass sie ständig gelesen werden, aber ganz selten verändert werden.
Wie können nun Caching-Strategien mit JPA bzw. Hibernate durchgeführt werden?


  1. Aktivieren des Hibernate Second Level Caches
  2. Konfigurieren des Cache-Providers
  3. Herausfiltern der Caching-Kandidaten und Kennzeichnen der Entities/Assoziationen

1. Aktivieren des Hibernate Second Level Caches
In der persistence.xml bzw. hibernate.cfg.xml wird die Property hibernate.cache.use_second_level_cache auf true gesetzt. Damit wird neben den First-Level-Cache, der alle gemanagten Entitäten der jeweiligen Hibernate Session beinhaltet, ein zweiter Cache in Hibernate aktiviert, der transaktionsübergreifend arbeitet.
Der First-Level-Cache ist an die aktuelle Transaktion gebunden und wird somit geleert, sobald die Transaktion abgeschlossen wurde.
Der Second-Level-Cache ist nicht an der Hibernate-Session gebunden, sondern ist gebunden an dem EntityManager bzw. an der HibernateSessionFactory. Dadurch können Entities zurückgegeben werden, ohne das hierzu eine Rückfrage an die Datenbank erfolgen muss, wenn diese Entities nicht in der aktuellen Transaktion ermittelt wurden, sondern in Transaktionen zuvor gelesen/geschrieben worden sind.

2.Konfigurieren des Cache-Providers
Hibernate kommt mit einer eigenen Implementierung für den Second-Level-Cache.
Dies ist aber nur eine Testimplementierung und ist keinesweges für den produktiven Einsatz gedacht.
Somit muss man den jeweiligen Cacheprovider auswählen und in der Konfiguration setzen:
hibernate.cache.region.factory_class
Es gibt einige Cacheprovider: JBoss Cache, Infinispan, ...
Infinispan wird der zukünftige Cacheprovider im JBoss sein und ist sehr praxiserprobt.
Die Einführung der Regions(Interface region.factory_class) ist neu.
Es gibt die Möglichkeit auch Query-Ergebnisse zu cachen. Die Regeln und Vorgehensweisen für einen solchen Cache unterscheiden sich für einen applikationsweiten Second-Level-Cache, der Entitäten transaktionsübergreifend cacht.
Somit kann der Second-Level-Cache in unterschiedliche Regionen unterteilt werden, damit die unterschiedlichen Cachemechanismen, Eviction-Policys etc. greifen können.

3.Herausfiltern der Caching-Kandidaten und Kennzeichnen der Entities/Assoziationen 
Damit eine Entität von Hibernate gecacht wird, muss sie mit einer Annotation versehen werden:
@org.hibernate.annotations.Cache bzw. JPA @javax.persistence.Cacheable
Eine Assoziation muss in der jeweiligen Getter-Methode der betreffenden Entität mit der hibernate-Annotation @org.hibernate.annotations.Cache gekennzeichnet werden.

Folgendes Buch befasst sich im Kapitel 9 bzgl. Caching und auch Query Cache:

Keine Kommentare:

Kommentar veröffentlichen