Загрузить всю таблицу в кеш Grails - PullRequest
1 голос
/ 05 мая 2011

Можно ли загрузить всю таблицу в кеш при запуске Grails?

Например, у меня есть 2 таблицы с 5000 записями в каждой, которые используются в качестве статических данных только для чтения. Эти данные наиболее сильно пострадали, так как вся информация о других таблицах получена из этой таблицы только для чтения.

Я знаю, что у grails есть сценарий использования кеша, но эта информация постоянно высвобождается из кеша в течение короткого промежутка времени, и она также повторно кэшируется только при следующем запросе.

В основном пытается сократить время отклика за счет отсутствия доступа к базе данных для этих статических данных.

Спасибо

1 Ответ

6 голосов
/ 05 мая 2011

Вы можете настроить поведение кэша с помощью ehcache.xml. Если у вас его нет, кеши будут настроены со значениями по умолчанию, но если вы это сделаете, они будут использоваться вместо этого. Поместите его в grails-app/conf, и он будет скопирован в путь к классам.

Предполагая, что класс вашего домена равен com.yourcompany.yourapp.YourDomainClass, вы можете указать количество элементов для кэширования и установить eternal = true, чтобы они не отбрасывались:

<ehcache>

   <diskStore path='java.io.tmpdir' />

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

   <cache name='com.yourcompany.yourapp.YourDomainClass'
      maxElementsInMemory='10000'
      eternal='true'
      overflowToDisk='false'
   />

   <!-- hibernate stuff -->
   <cache name='org.hibernate.cache.StandardQueryCache'
      maxElementsInMemory='50'
      eternal='false'
      timeToLiveSeconds='120'
      maxElementsOnDisk='0'
   />

   <cache
      name='org.hibernate.cache.UpdateTimestampsCache'
      maxElementsInMemory='5000'
      eternal='true'
      maxElementsOnDisk='0'
   />

</ehcache>

Для получения дополнительной информации о том, как настроить ehcache.xml, см. http://ehcache.org/ehcache.xml, у которого много комментариев в комментариях.

Сделав это, ваш BootStrap.groovy должен выглядеть примерно так:

import com.yourcompany.yourapp.YourDomainClass

class BootStrap {

   def init = { servletContext ->
      def ids = YourDomainClass.executeQuery('select id from YourDomainClass')
      for (id in ids) {
         YourDomainClass.get(id)
      }
   }
}

Вызвав get() для каждого экземпляра, будущие вызовы get() будут использовать кэш 2-го уровня.

...