Grails/GORM默认获取策略:何时将fetchMode设置为";急切的;?(渴望与懒惰)

Grails/GORM默认获取策略:何时将fetchMode设置为";急切的;?(渴望与懒惰),grails,gorm,Grails,Gorm,关于在域类中将fetchMode设置为“eager”的时间,有哪些一般准则?fetchMode“急切”与默认“懒惰”的优缺点 请包括一些具体的示例/用例,说明何时使用“渴望”(fetchMode=Earge),何时不使用(fetchMode=lazy)。基本上,延迟加载比渴望加载有更多的好处(性能、资源使用)。由于它是所有关系的默认grails设置(自grails 1.1以来),因此通常不应将其配置为即时抓取,除非遇到某些问题。例如: 通过不同的hibernate会话共享域实例(例如,将域类实

关于在域类中将fetchMode设置为“eager”的时间,有哪些一般准则?fetchMode“急切”与默认“懒惰”的优缺点


请包括一些具体的示例/用例,说明何时使用“渴望”(fetchMode=Earge),何时不使用(fetchMode=lazy)。

基本上,延迟加载比渴望加载有更多的好处(性能、资源使用)。由于它是所有关系的默认grails设置(自grails 1.1以来),因此通常不应将其配置为即时抓取,除非遇到某些问题。例如:

  • 通过不同的hibernate会话共享域实例(例如,将域类实例放入http会话范围并从中访问属性时,例如用户)
  • 访问布局/视图中的域类实例时获取LazyInitializationException
  • 如果确定每次(或大部分时间)获取实例时都会访问某个关系属性,那么将此关系配置为即时获取也是有意义的
在处理大型数据库时,急于抓取可能非常危险。想象一下这样的域类:

// really bad example
class TreeNode {

   String name            

   TreeNode parent

   static hasMany = [ childNodes: TreeNode ]

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

}
当您读取任何TreeNode实例时,它将自动将域类的所有其他实例从数据库拉入内存。当有足够的实例时,您可能会因为只获取一个实例而终止应用程序