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
GO TO FULL VERSION