将整个表加载到缓存Grails中

时间:2011-05-04 20:28:29

标签: hibernate grails gorm

是否可以在Grails启动时将整个表加载到缓存中?

例如,我有一个2个表,每个表有5000条记录,用作静态只读数据。这个数据是最受欢迎的,因为其他表上的所有信息都是从这个只读表中派生出来的。

我知道grails有一个缓存使用场景,但是这个信息会在很短的时间后不断从缓存中逐出,并且只会在下一个请求中重新缓存。

基本上尝试通过不必访问此静态数据的数据库来减少响应时间。

由于

1 个答案:

答案 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()的未来调用将使用第二级缓存。