Hibernate 2nd-level-cache in einem Grails-app
Teil I
In einem Grails-app, ich verstehe, dass Sie damit den 2nd-level-cache pro domain-Klasse durch hinzufügen von
static mapping {
cache true
}
Standardmäßig wird der 2nd level cache wird nur verwendet, wenn get()
genannt wird, aber es kann auch verwendet werden, für die Kriterien Abfragen und dynamische Finder durch hinzufügen cache true
zu der Abfrage.
Allerdings bin ich mir noch nicht sicher, ich verstehen Sie, wie der Abfrage-cache arbeitet. Meine beste Vermutung ist, dass:
- gibt es separate Abfrage-caches für jede domain-Klasse, z.B. ein Buch-und ein weiteres für den Verfasser
- bevor eine Abfrage wie
Author.findByName('bob', [cache: true])
ausgeführt wird, wird ein cache-key berechnet wird, basiert auf der domain-Klasse (Autor), die Abfrage (findByName) und die Abfrage-Parameter ('bob'). Wenn dieser Schlüssel gefunden wird, in dem der Autor query-cache, wird das zwischengespeicherte Ergebnis zurückgegeben werden, anstatt die Ausführung der Abfrage - jedes mal, wenn ein Autor gespeichert ist, gelöscht oder aktualisiert werden, der Autor der query-cache ist geleert
Dies scheint vernünftig, bis wir Bedenken, dass eine Abfrage zurückgibt Buch-Instanzen können sich an den Autor-Tabelle. In diesem Fall wäre es notwendig, zu Spülen, sowohl das Buch und der Autor query-caches, wenn ein Autor gespeichert ist, gelöscht oder aktualisiert werden. Dies führt mich zu der Vermutung, dass es vielleicht nur einen einzigen query-cache und es wird automatisch gelöscht, sobald Sie alle zwischengespeicherten Domänen-Klasse gespeichert ist?
Teil II
In der Grails-docs es wird erwähnt, dass
Sowie die Fähigkeit zur Nutzung von Hibernate ist die zweite Ebene von cache zu cache-Instanzen Sie können auch cache-Sammlungen (Vereinigungen) von Objekten.
Beispiel:
class Author {
static hasMany = [books: Book]
static mapping = {
cache true //Author uses the 2nd level cache
books cache: true //associated books use the 2nd level cache
}
}
class Book {
static belongsTo = [author: Author]
static mapping = {
cache true //Book uses the 2nd level cache
}
}
Macht die Konfiguration von oben Sinn machen, d.h. wenn der Autor und das Buch selbst sind Sie mit dem 2nd-level-cache, wird es einen nutzen zu machen, den Autor-Buch Verband verwenden Sie die 2nd-level-cache?
Teil III
Endlich, ich habe gelesen, diese Beratung über die Verwendung des 2nd-level-query-cache, was bedeutet, dass es sollte nur verwendet werden, für die sich selten ändern von domain-Klassen. Gibt es irgendwelche Umstände, unter denen man, sollten Sie nicht aktivieren Sie die 2nd-level-cache für get()
Operationen, d.h. einen Grund, warum man nicht fügen Sie den folgenden, um eine domain-Klasse
static mapping = {
cache true //Book uses the 2nd level cache
}
InformationsquelleAutor der Frage Dónal | 2012-02-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Teil 1:
Hibernate macht das richtige. Der Abfrage-cache ist nicht pro Person. Es ist eine einzelne Abfrage-cache-region, von allen geteilten Abfragen, es sei denn, Sie legen eine bestimmte region für eine Abfrage. Jedes mal, wenn eine Tabelle aktualisiert wird, deren Zeitstempel die Zeitstempel der cache aktualisiert wird. Jedes mal, wenn eine Abfrage ausgeführt wird, wird der Zeitstempel von jedem der Tische, an denen die Abfrage nach Vergleich der Zeitstempel der Cache-Ergebnis. Und natürlich wird das zwischengespeicherte Ergebnis zurückgegeben, nur wenn itstimestamp ist Aktueller als die Tabelle timestamps.
Teil 2:
Ja, es macht Sinn. Den cache der Autor erinnert sich, dass der Autor mit der ID 456 hat den Namen "foo" und das Geburtsdatum 1975/07/19. Nur die Daten, die in der Autor-Tabelle gespeichert ist. Also, Zwischenspeichern der Verein ist auch nützlich: statt eine zusätzliche Abfrage, um die Menge der Bücher, die der Autor beim Aufruf
author.getBooks()
Hibernate, erhalten die IDs der Bücher, die der Autor aus seinem cache an, und laden Sie dann jedes Buch aus der second-level-cache. Stellen Sie sicher, dass cache der Bücher, obwohl.Teil 3:
Kann ich mir vorstellen, mehrere Gründe:
InformationsquelleAutor der Antwort JB Nizet