Grails加载数据一次

时间:2014-05-24 07:51:37

标签: grails gorm

我有这两个域名

class Country {
    String name
    static hasMany = [cities:City]
}

class City {

    String name;
    static belongsTo = [country: Country]
   }

这两个表中包含的数据相对较大,并且在所有屏幕中都使用了它们, 每次我选择一个国家,我都要重装所有的城市。

如何在内存中加载一次数据,以便我可以在所有屏幕中更快地访问它。

我尝试将城市用于急切的抓取,并尝试使用缓存插件。

谢谢

2 个答案:

答案 0 :(得分:2)

您可以将两个域类配置为自动缓存,并在cities中缓存Country关系:

class Country {
    String name
    static hasMany = [cities:City]

    static mapping = {
        cache true
        cities cache:true
    }
}

class City {
    String name
    static belongsTo = [country: Country]

    static mapping = {
        cache true
    }
}

答案 1 :(得分:1)

缓存通常是一个很好的策略,但请记住缓存具有到期参数,因此如果闲置,您的应用可能会再次从数据库重新加载。根据您的缓存提供程序,您必须对此进行调整,例如,对于ehcache编辑grails配置文件夹中的ehcache.xml并设置(缓存名称与您的Domain类相同,包括包名称):

<cache name="Country" maxElementsInMemory="1000" timeToIdleSeconds="0" timeToLiveSeconds="0"/>

您还应该将查询移动到服务中,默认情况下服务是单一作用域,服务方法也可以缓存。

另一种方法是将它们存储在应用程序范围中,例如在您的Bootstrap.groovy中运行查询并分配结果:

servletContext.countries = Country.list()

以相同的方式检索它们,例如

在控制器中:

List<Country> countries = servletContext.countries

或gsp:

<g:each var="country" in="${application.countries}">
   ${country}
</g:each>

如果您有急切的提取,那么您应该看不到数据库命中。