我有这两个域名
class Country {
String name
static hasMany = [cities:City]
}
class City {
String name;
static belongsTo = [country: Country]
}
这两个表中包含的数据相对较大,并且在所有屏幕中都使用了它们, 每次我选择一个国家,我都要重装所有的城市。
如何在内存中加载一次数据,以便我可以在所有屏幕中更快地访问它。
我尝试将城市用于急切的抓取,并尝试使用缓存插件。
谢谢
答案 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>
如果您有急切的提取,那么您应该看不到数据库命中。