Подтвердить что ты не робот

Кэширование объектов домена в Grails

Я рассматриваю возможность внедрения EhCache в своих объектах домена Grails, таких как:

static mapping = {
   cache true
}

Я не очень хорошо разбираюсь в том, как работает этот механизм кеширования, и задавался вопросом, какое правильное правило заключается в определении того, какие объекты домена будут полезны при кешировании. например, объекты, к которым обращаются редко, часто...?

Спасибо!

4b9b3361

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