Grails的。将只读集合存储在变量中

时间:2012-03-29 14:35:56

标签: grails gorm

更新。检查这些benchmarks以自行测试。

我是否应该将对象集合存储在某些服务的变量中,如下所示:

ConfigService{
   private def countries = Country.findAllBySomeCondition()

   public def countries(){
      return countries
   }
}

或使用:

ConfigService{

   public def countries(){
      return Country.findAllBySomeCondition()
   }
}

如果该集合经常只用于阅读。

2 个答案:

答案 0 :(得分:2)

取决于。在您的第一个示例中,缓存了值,这可能会更高效,但如果在某个时候添加更多国家/地区,则可能不会显示您的服务呼叫。但是,如果您经常使用第二个示例调用.countries(),则可能会产生一些性能提升。

最好的选择可能是获得一些关于查询花费时间的基准,并决定是否最好自己尝试缓存值,或确保它始终是最新的。我的建议是坚持使用第二个例子,因为Hibernate已经为你处理了一些缓存,而且列表可能不足以显着阻碍你的app。

答案 1 :(得分:1)

@ GrailsGuy的回答是现场,我给了他一个+1。为您提供一些其他选择:

1)如果您的国家/地区列表没有更改,您可以将它们放在枚举中并避免使用DB。

2)如果您授予用户添加/删除/编辑国家/地区的功能,则可以像示例1中那样缓存列表,但是当用户添加/删除/编辑国家/地区时,您可以强制重新加载列表。

ConfigService{
   private def countries

   public def countries(){
      if(countries == null) {
          countries = Country.findAllBySomeCondition()
      }
      return countries
   }
}

CountryService {
    def configService

    def addCountry() {
        //Do add country stuff
        configService.countries = null
    }
}

这样,您可以缓存这些国家/地区,直到它们得到更新。就像@GrailsGuy所说虽然Hibernate会在某种程度上为你做这件事。