Grails\Hibernate: кэшировать или не кэшировать?

Какова лучшая политика кэширования в Hibernate\Grails. Кэшировать все объекты и запросы или нет, и как найти лучшее решение?

Вот моя конфигурация hibernate.

hibernate {
  cache.use_second_level_cache = true
  cache.use_query_cache = true
  cache.provider_class = 'org.hibernate.cache.EhCacheProvider'
  connection.useUnicode = true
  connection.characterEncoding = 'UTF-8'
  connection.provider_class = 'org.hibernate.connection.C3P0ConnectionProvider'
  dialect = 'org.hibernate.dialect.MySQL5InnoDBDialect'
  order_updates = true
  c3p0.min_size = 5
  c3p0.max_size = 20
  c3p0.max_statements = 20 * 10
  c3p0.idle_test_period = 15 * 60
}

Конфигурация Ehcache

<defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        maxElementsOnDisk="10000000"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="120"
        diskSpoolBufferSizeMB="100"
        memoryStoreEvictionPolicy="LRU"
/>

<cache
            name="org.hibernate.cache.StandardQueryCache"
            maxElementsInMemory="50"
            eternal="false"
            timeToLiveSeconds="120"
            overflowToDisk="true"
/>

person Oleksandr    schedule 26.01.2011    source источник


Ответы (1)


Лучшая политика кэширования: без кэширования. Если серьезно, то кеширование (и любую оптимизацию) нужно делать только для решения существующей проблемы. Если у вас нет проблем с производительностью, не используйте кэширование. Если у вас есть проблемы с производительностью, примените эту простую 5-этапную процедуру для решения проблем с производительностью:

  1. Мера.
  2. Мера.
  3. Оптимизировать (например, добавить кеширование)
  4. Мера.
  5. Мера.

Обратите внимание: если вы не понимаете, как работает кэширование в Hibernate, вы можете получить низкую производительность вместо ее улучшения. Кроме того, даже если вы понимаете, как кэширование работает в Hibernate, могут быть другие эффекты, влияющие на производительность, в результате чего обращение к базе данных будет быстрее, чем поиск в кеше. Вот почему вы должны измерять до и после «улучшений».

person jpkrohling    schedule 26.01.2011
comment
Лучшая политика кэширования: никакого кэширования!?? Где ты был под кайфом, когда писал это? - person Al-Punk; 05.03.2014
comment
Вы читали, что я написал? Если ваш первый инстинкт, когда вы сталкиваетесь с медлительностью, — кэшировать вещи, то это неправильно. Если вы уверены, что кэширование поможет, и вы это измеряли, то кэширование является альтернативой. Не зная, как это работает, когда работает и почему работает, лучше вообще не кешировать. - person jpkrohling; 05.03.2014
comment
Я прочитал то, что вы написали, и я согласен с процедурой 5 шагов. Я не согласен с агрессивным подходом к кэшированию в целом и с тем, как вы начинаете свой аргумент. Существует много динамичных действий и тысячи пользователей, которые обращаются к базам данных или другим службам на крупных веб-сайтах. Сказать, что лучшее кэширование — это не кэширование, абсурдно! ...если вы не имеете в виду блог моей бабушки - person Al-Punk; 06.03.2014
comment
Действительно, извините за тон, но я бы его сохранил. Причина в том, что большинство приложений не достигают даже сотен одновременных запросов, а проблемы с производительностью, которые можно решить с помощью кэширования, не являются общими решениями и требуют большого количества знаний о внутренней работе самого приложения. Вот почему отсутствие кэширования всегда является лучшим общим подходом, за исключением случаев, когда вы можете доказать обратное. - person jpkrohling; 06.03.2014