Caching einrichten

Kehren wir zu unseren Caching-Einstellungen in der Datei hibernate.cfg.xml zurück:

<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletEhCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

Achten Sie auf die erste Zeile – sie enthält den Namen der Caching-Engine-Klasse. Hibernate implementiert das Caching nicht wirklich intern, sondern stellt stattdessen eine Reihe von Schnittstellen bereit, mit denen Sie Ihre eigene Caching-Engine implementieren können.

Beliebte Implementierungen sind:

  • EHCache
  • OSCache
  • SchwarmCache
  • JBoss TreeCache

EHCache

Es kann im Speicher oder auf der Festplatte sowie im Cluster-Caching zwischengespeichert werden und unterstützt auch einen optionalen Cache für Hibernate-Abfrageergebnisse.

OSCache

Unterstützt Speicher- und Festplatten-Caching in derselben JVM mit einem umfangreichen Satz an Ablaufrichtlinien und Abfrage-Cache-Unterstützung.

SchwarmCache

Cluster-Cache basierend auf JGroups. Es verwendet Cluster-Invalidierung, unterstützt jedoch nicht den Hibernate-Abfrage-Cache.

JBoss-Cache

Ein vollständig transaktional replizierter Cluster-Cache, der ebenfalls auf der JGroups-Multicast-Bibliothek basiert. Es unterstützt Replikation oder Invalidierung, synchrone oder asynchrone Kommunikation sowie optimistisches und pessimistisches Sperren. Der Ruhezustands-Abfrage-Cache wird unterstützt.

Diese Engines unterstützen nicht alle parallelen Zugriffsstrategien. Die tatsächliche Situation wird in der folgenden Tabelle beschrieben:

Strategie/Anbieter Schreibgeschützt nicht strikter Lese-/Schreibzugriff lesen Schreiben transaktional
EHCache X X X
OSCache X X X
SchwarmCache X X
JBoss-Cache X X

Beispiel für eine EHCache-Konfiguration

Die EHCache- Engine verfügt über eine eigene Konfigurationsdatei namens ehcache.xml. Der ungefähre Inhalt einer solchen Datei:

<diskStore path="java.io.tmpdir"/>

<defaultCache
    maxElementsInMemory = "1000"
    eternal = "false"
    timeToIdleSeconds = "120"
    timeToLiveSeconds = "120"
    overflowToDisk = "true"
/>

<cache name = "Employee"
    maxElementsInMemory = "500"
    eternal = "true"
    timeToIdleSeconds = "0"
    timeToLiveSeconds = "0"
    overflowToDisk = "false"
/>

Hier können Sie die Caching-Einstellungen sowohl allgemein als auch für jede Entität separat konfigurieren. Lesen Sie mehr in der offiziellen Dokumentation .

Analyse der Caching-Statistiken

Möglicherweise müssen Sie auch überprüfen, wie gut der Caching-Mechanismus konfiguriert ist. Hibernate stellt hierfür eigens ein spezielles Statistics-Objekt zur Verfügung.

Beispiel:

Statistics statistics = session.getSessionFactory().getStatistics();
CacheRegionStatistics cacheStatistics = statistics.getDomainRegionStatistics(“com.codegym.employee”);

long hitCount = cacheStatistics.getHitCount();
long missCount = cacheStatistics.getMissCount();
double hitRatio = (double) hitCount / (hitCount + missCount);

Darauf gehen wir nicht näher ein, da es noch viele Jahre dauern wird, bis Ihnen die Standard-Caching-Lösungen ausgehen und Sie diese manuell verbessern müssen. Dieser Kommentar könnte übrigens einem ähnlichen Fall entnommen sein:

// Dear programmer:
// When you're done "optimizing" this routine
// and realize how big of a mistake it was to do this,
// please increment the counter at the bottom as a warning
// for the next guy:
// number_of_hours_spent_here = 42