Grails. Хранить коллекцию только для чтения в переменной - PullRequest
2 голосов
/ 29 марта 2012

UPDATE. Проверьте эти тесты , чтобы проверить это сами.

Должен ли я хранить коллекцию объектов в переменной некоторого сервиса, подобного этому:

ConfigService{
   private def countries = Country.findAllBySomeCondition()

   public def countries(){
      return countries
   }
}

или используйте:

ConfigService{

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

Если коллекция будет часто использоваться только для чтения.

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Зависит. В первом примере значение кэшируется, что может быть немного более эффективным, но если в какой-то момент будет добавлено больше стран, они могут не появиться в вашем сервисном вызове. Однако, если вы часто звоните по номеру .countries() со вторым примером, вы можете столкнуться с некоторыми падениями производительности.

Наилучшим вариантом, вероятно, было бы получить некоторые показатели относительно того, сколько времени занимают запросы, и решить, лучше ли попытаться кэшировать значение самостоятельно или убедиться, что оно всегда актуально. Мое предложение было бы придерживаться второго примера, поскольку Hibernate уже обрабатывает некоторое кеширование для вас, и есть вероятность, что список недостаточно велик, чтобы существенно помешать вашему приложению.

1 голос
/ 30 марта 2012

@ Ответ 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 в некоторой степени сделает это за вас.

...