Стратегия извлечения Grails / GORM по умолчанию: когда установить fetchMode на «eager»? (нетерпеливый против ленивых) - PullRequest
6 голосов
/ 17 марта 2009

Каковы некоторые общие рекомендации относительно того, когда устанавливать fetchMode в "нетерпеливый" в классе домена? Плюсы и минусы fetchMode «рвение» против «ленивого» по умолчанию?

Пожалуйста, включите несколько конкретных примеров / вариантов использования, показывающих, когда использовать "eager" (fetchMode = eager), а когда нет (fetchMode = lazy).

1 Ответ

16 голосов
/ 17 марта 2009

В основном отложенная загрузка имеет больше преимуществ, чем энергичная альтернатива (производительность, использование ресурсов). Так как это настройка по умолчанию для всех отношений (начиная с Grails 1.1), вам обычно не следует настраивать ее для активной выборки, если только у вас не возникнут определенные проблемы. Такие как:

  • Совместное использование экземпляра домена в разных сеансах гибернации (например, при помещении экземпляра класса домена в область сеанса http и доступе к свойствам из него, например, пользователю)
  • Получение исключения LazyInitializationException при доступе к экземплярам классов домена в макетах / представлениях
  • Если вы уверены, что вы будете получать доступ к определенному свойству отношения каждый раз (или большую часть времени) при получении экземпляра, также имеет смысл настроить это отношение для быстрой загрузки.

Стремительная выборка может быть довольно опасной при работе с огромными базами данных. Представьте себе класс Domain, подобный этому:

// really bad example
class TreeNode {

   String name            

   TreeNode parent

   static hasMany = [ childNodes: TreeNode ]

   static mapping {     
      parent lazy: false
      childNodes lazy: false
   }

}

когда вы читаете любой из экземпляров TreeNode, он автоматически вытягивает все остальные экземпляры класса домена из базы данных в вашу память. Когда будет достаточно экземпляров, вы, вероятно, убьете свое приложение, выбрав только 1 экземпляр.

...