2010-06-29 3 views
6

Ich versuche derzeit, Hibernate arbeiten mit dem Caching-Provider, der mit Hibernate kommt.Hibernate 2nd Level Caching scheint nicht zu funktionieren

net.sf.ehcache.hibernate.SingletonEhCacheProvider 

Ich habe eine Standard-Cache und eine bestimmte Klasse Cache im ecache.xml aktiviert, die in meiner hibernate.cfg.xml Datei verwiesen wird. Der für die Klasse/Mapping-Datei spezifische Cache ist für die Verarbeitung von bis zu 20000 Objekten definiert.

Ich sehe jedoch keine Leistungssteigerungen, seit ich das Cache-Mapping auf einer der Mapping-Dateien im Im Test mit aktiviert habe.

Mein Test ist wie folgt.

Laden Sie 10000 Objekte der bestimmten Mapping-Datei im Test (dies sollte die DB treffen und ein Flaschenhals sein). Als nächstes gehe ich, um die gleichen 10000 Objekte zu laden, als dieser Punkt würde ich erwarten, dass der Cache getroffen werden und erhebliche Leistungssteigerungen zu sehen. Habe versucht, sowohl das "Read-Only" - als auch das "Read-Write" -Cache-Mapping in der Hibernate-Mapping-XML-Datei zu verwenden, mit der ich im Test bin.

Ich frage mich, ist alles, was ich tun muss, um sicherzustellen, dass der Cache vor dem DB beim Laden von Objekten getroffen wird?

Hinweis als Teil des Tests im Pagin durch diese 10000 Datensätze mit etwas ähnliches wie unten (paging a 1000 Datensätze zur Zeit).

Criteria crit = HibernateUtil.getSession() .createCriteria(persistentClass); 
     crit.setFirstResult(startIndex); 
     crit.setFetchSize(fetchSize); 
     return crit.list(); 

haben, die Kriterien hat einen Caching-Modus Setter (setCacheMode()) gesehen, so ist es etwas, was ich damit tun sollte ??

Ich stelle fest, die unter Statistik Code, der 10000 Objekte Theres (gut entwässerten onjects hiberante i vorstellen ??) in Erinnerung, aber aus irgendeinem Grund Ich erhalte 0 Treffer und beunruhigender 0 Misses so sieht es aus wie es nicht geht zum Cache überhaupt, wenn er nachschaut, obwohl der Statistik-Code mir zu sagen scheint, dass es 10000 Objekte im Speicher gibt.

Irgendwelche Ideen, was ich mache? Ich nehme an, dass das Erhalten von Fehlern gut ist, da es bedeutet, dass der Cache verwendet wird, aber ich kann nicht herausfinden, warum ich keine Cache-Treffer bekomme. Liegt es an der Tatsache, dass ich setFirstResult() und setFetchSize() mit Kriterien verwende.

System.out.println("Cache Misses = " + stats.getSecondLevelCacheMissCount()); 
System.out.println("Cache Hits Count = " + stats.getSecondLevelCacheHitCount()); 

System.out.println("2nd level elements in mem "+ stats.getSecondLevelCacheStatistics("com.SomeTestEntity").getElementCountInMemory()); 

Antwort

13

Der Second-Level-Cache funktioniert für "Suche nach Primärschlüssel". Für weitere Fragen, müssen Sie Cache die Abfrage (die Abfrage-Cache zur Verfügung gestellt aktiviert ist), in Ihrem Fall mit Criteria#setCacheable(boolean):

Criteria crit = HibernateUtil.getSession().createCriteria(persistentClass); 
crit.setFirstResult(startIndex); 
crit.setFetchSize(fetchSize); 
crit.setCachable(true); // Enable caching of this query result 
return crit.list(); 

ich lesen vorschlagen:


Wenn ich die Abfrage zwischenspeichern, sind ein Werden sie Entitäten aus der Abfrage in den Ruhezustand versetzen, die dann im Cache der zweiten Ebene verfügbar ist?

Ja werden sie.Dies wird schwarz in weiß in der Verbindung erklärt, die ich erwähnte: "Beachten Sie, dass der Abfragecache den Zustand der tatsächlichen Entitäten in der Ergebnismenge nicht zwischenspeichert; es zwischenspeichert nur Bezeichnerwerte und Ergebnisse von Werttyp. So sollte der Abfragecache immer in Verbindung mit dem Second-Level-Cache ". Hast du es gelesen?

Da hatte ich den Eindruck, dass die Verwendung des Abfragecaches völlig anders war als die Verwendung des Ruhezustandscaches der zweiten Ebene.

Es ist anders (der "Schlüssel" für die Cache-Eingabe (s) ist anders). Die Abfrage-Caches basieren jedoch auf dem L2-Cache.

Aus Ihrer Antwort scheinen Sie werden darauf hindeutet, dass die Abfrage-Cache und Second-Level-Cache sind beide gleich, und Cache-Hits zu erzeugen, ich brauche die „von Primärschlüssel finden“ werden.

Ich sage nur, dass Sie die Abfrage zwischenspeichern müssen, da Sie nicht "nach Primärschlüssel suchen". Ich verstehe nicht, was nicht klar ist. Haben Sie versucht, setCacheable(true) für Ihr Abfrage- oder Kriterienobjekt aufzurufen? Sorry für das Bestehen, aber hast du den Link gelesen, den ich gepostet habe?

+0

So nur den Cache der 2. Ebene löschen kann nie verwendet werden, es sei denn es ist mit "Suche nach Primärschlüssel" verwendet? Ist die crit.list(); (Wenn der Cache für die Entität is aktiviert ist) Füllen Sie den Cache der zweiten Ebene im Beispielcode auf? Wenn ja, kann ich nur auf den Cache zugreifen, wenn ich das Hiberanet-Äquivalent von "finde nach Primärschlüssel" verwende ?? – John

+0

@John Wie ich in meiner Antwort geschrieben habe, müssen Sie die Abfrage zwischenspeichern. Was ist damit nicht klar? –

+0

Ich bin immer noch leicht verwirrt. Wenn ich die Abfrage zwischenspeichere, sind dann alle Hiberante-Entitäten aus der Abfrage im Cache der zweiten Ebene verfügbar? Da ich den Eindruck hatte, dass die Verwendung des Abfragecaches völlig anders ist als die Verwendung des Ruhezustandscaches der zweiten Ebene. Aus Ihrer Antwort scheinen Sie zu sagen, dass der Abfrage-Cache und der Cache der zweiten Ebene identisch sind, und um Cache-Treffer zu erzeugen, muss ich den "Suche nach Primärschlüssel" verwenden. – John

Verwandte Themen