Кэширование работает только для вызовов 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 делают информацию доступной, и вы можете использовать подход в своем собственном коде.