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

Schreibe einen Kommentar