Часть I
В приложении Grails я понимаю, что вы включаете кэш 2-го уровня для каждого класса домена, добавляя
static mapping {
cache true
}
По умолчанию кэш 2-го уровня используется только при вызове get()
, но его также можно использовать для запросов критериев и динамических искателей, добавив cache true
к запросу.
Однако я все еще не уверен, что понимаю, как работает кэш запросов. Я думаю, что:
- существуют отдельные кэши запросов для каждого класса домена, например, один для книги, другой для автора
- перед выполнением запроса, подобного
Author.findByName('bob', [cache: true])
, вычисляется ключ кэша, который основан на классе домена (Author), запросе (findByName) и параметрах запроса ('bob'). Если этот ключ найден в кеше запросов автора, кэшированные результаты возвращаются вместо выполнения запроса
- каждый раз, когда автор сохраняется, удаляется или обновляется, кэш запроса автора сбрасывается
Это кажется разумным, пока мы не посчитаем, что запрос, который возвращает экземпляры Book, может присоединиться к таблице Author. В этом случае необходимо будет очистить кэш запросов «Книга» и «Автор» при сохранении, удалении или обновлении автора. Это заставляет меня подозревать, что, возможно, существует только один кэш запросов, и он очищается всякий раз, когда сохраняется какой-либо класс кэшированных доменов?
Часть II
В документах Grails упоминается, что
Помимо возможности использовать кэш второго уровня Hibernate для кэширования экземпляров, вы также можете кэшировать коллекции (ассоциации) объектов.
Например:
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
}
}
Имеет ли смысл приведенная выше конфигурация, т. Е. Если Автор и Книга сами используют кэш 2-го уровня, есть ли преимущество в том, что ассоциация Автор-Книга также использует кэш 2-го уровня?
Часть III
Наконец, я прочитал этот совет об использовании кэша запросов 2-го уровня, который предполагает, что его следует использовать только для нечасто меняющихся классов домена. Существуют ли обстоятельства, при которых нельзя включать кэш 2-го уровня для операций get()
, т. Е. Какие-либо причины, по которым нельзя добавить следующее к классу домена
static mapping = {
cache true // Book uses the 2nd level cache
}