是否可以在Grails启动时将整个表加载到缓存中?
例如,我有一个2个表,每个表有5000条记录,用作静态只读数据。这个数据是最受欢迎的,因为其他表上的所有信息都是从这个只读表中派生出来的。
我知道grails有一个缓存使用场景,但是这个信息会在很短的时间后不断从缓存中逐出,并且只会在下一个请求中重新缓存。
基本上尝试通过不必访问此静态数据的数据库来减少响应时间。
由于
答案 0 :(得分:6)
您可以使用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()
的未来调用将使用第二级缓存。