【问题标题】:Grails. Store read-only collection in variable圣杯。将只读集合存储在变量中
【发布时间】:2012-03-29 14:35:55
【问题描述】:

更新。检查这些benchmarks 自己测试一下。

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

ConfigService{
   private def countries = Country.findAllBySomeCondition()

   public def countries(){
      return countries
   }
}

或使用:

ConfigService{

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

如果集合经常只用于读取。

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    视情况而定。在您的第一个示例中,该值被缓存,这可能会更有效,但如果在某个时候添加了更多国家/地区,它们可能不会显示在您的服务调用中。但是,如果您在第二个示例中经常调用 .countries(),您可能会招致一些性能损失。

    最好的选择可能是获取一些关于查询需要多长时间的基准,并决定最好自己尝试缓存值,还是确保它始终是最新的。我的建议是坚持使用第二个示例,因为 Hibernate 已经为您处理了一些缓存,而且列表可能不够大,不足以严重阻碍您的应用程序。

    【讨论】:

      【解决方案2】:

      @GrailsGuy 的回答很到位,我给了他+1。为您提供一些其他选项,您可以:

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

      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 会在某种程度上为您做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-03
        • 2017-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        相关资源
        最近更新 更多