Вы можете настроить поведение кэша с помощью 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-го уровня.