Ответ 1
Кэширование работает только для вызовов get()
по умолчанию, но запросы используют кеш запросов, если вы обновляете их с помощью cache: true
(критерии и HQL).
cache true
создает кеш чтения-записи, но вы можете настроить кеш-доступ только для чтения с помощью
static mapping = {
cache usage:'read-only'
}
Кэш только для чтения хорош для данных поиска, которые никогда не меняются, например, состояний, стран, ролей и т.д.
Если у вас есть классы домена, которые часто обновляют, создают или удаляют, кеширование запросов часто будет медленнее, чем кэширование. Это связано с тем, что подобные изменения заставляют все кэшированные запросы очищаться, поэтому вы часто переходите непосредственно к базе данных. Подробнее об этом см. http://tech.puredanger.com/2009/07/10/hibernate-query-cache/. По этой причине я редко использую кеширование запросов и часто полностью отключает его с помощью
hibernate {
cache.use_second_level_cache=true
cache.use_query_cache=false
cache.provider_class='org.hibernate.cache.EhCacheProvider'
}
Доменные классы, которые являются "главным образом прочитанными", являются лучшими кандидатами для кэширования чтения и записи. Кэш очищается для каждого обновления, создания и удаления, но если они несколько редки, вы увидите общее повышение производительности.
Hibernate имеет API для контроля использования кеша. Плагины http://grails.org/plugin/app-info и http://grails.org/plugin/hibernate-stats делают эту информацию доступной, и вы можете использовать подход туда в своем собственный код.