2012-04-03 3 views
2

Ich habe eine Java-Anwendung, die die Persistenzbibliothek Hibernate mit etwa 100 zugeordneten Klassen verwendet. Um Caching der zweiten Ebene zu testen, habe ich @Cacheable 5 der zugeordneten Klassen hinzugefügt. Dies führte dazu, dass eine Standardberechnungsaufgabe die doppelte Zeit benötigte, die sie früher benötigte, obwohl es mehrere Treffer für die zwischengespeicherten Elemente gab (wie in der Couchbase-Cacheüberwachungskonsole belegt). Ich kann nicht die genaue durchschnittliche Trefferquote aufgrund der vorübergehenden Natur der Couchbase-Statistiken erhalten, aber ich schätze es bei nur etwa 10-20%.Hibernate-Caching verursacht Leistungsabfall bei niedrigem Prozentsatz von @Cacheable-Entitäten?

Hat die Aktivierung des Caching für einige Entitäten Auswirkungen auf die Zugriffszeiten anderer Entitäten, die nicht als @Cacheable markiert sind, was zu diesem Leistungsabfall führt? Oder ist es nur durch die zusätzliche Latenz der Cache-Abfrage in Verbindung mit einer niedrigen Trefferquote auf die zwischengespeicherten Elemente verursacht?

Ich benutze Hibernate 3.3. Ich habe das Zwischenspeichern von Abfragen deaktiviert. Ich habe ähnliche Ergebnisse mit Memcached & GemFire ​​als Cache-Provider.

+0

Keine Antworten? Wenn jemand eine vage Ahnung hat oder zusätzliche Informationen benötigt werden, um diese Frage zu beantworten, lassen Sie es mich wissen. –

Antwort

1

Nun, ich denke, es hängt davon ab, was der Cache-Provider tut, um zu sehen, ob der Eintrag zwischengespeichert wird. Wenn dies eine teure Operation ist, wird das Abrufen von Daten aus der Datenbank teuer sein, wenn die Cache-Trefferquote niedrig ist. Im Allgemeinen sollten Cache-Anbieter versuchen, dies so günstig wie möglich zu machen. Im Fall von Infinispan ist dies beispielsweise eine einfache In-Memory-Prüfung, um festzustellen, ob die Entität zwischengespeichert ist oder nicht. Wenn nicht, wird der Eintrag über Hibernate aus der Datenbank abgerufen, und der Infinispan-Cache-Provider speichert ihn im Cache eine sehr effiziente Put-Operation putForExternalRead genannt.

Sie sollten wirklich geben Infinispan Cache-Anbieter einen gehen. Weitere Informationen in https://docs.jboss.org/author/x/FgY5. Wenn Sie innerhalb von JBoss AS7 arbeiten, lesen Sie stattdessen https://docs.jboss.org/author/x/LoJ7.

Haftungsausschluss: Ich bin ein Infinispan-Entwickler.

+0

Ich kann den Infinispan-Cache-Provider nicht verwenden - Ich möchte eine Lese-Schreib-Concurrency-Strategie verwenden. –

Verwandte Themen