6

关于何时在域类中将 fetchMode 设置为“eager”的一些一般准则是什么?fetchMode“eager”与默认“lazy”的优缺点?

请包括一些具体的示例/用例,显示何时使用“eager”(fetchMode=eager),何时不使用(fetchMode=lazy)。

4

1 回答 1

16

基本上延迟加载比急切的替代方案(性能、资源的使用)有更多的好处。由于它是所有关系的默认 grails 设置(自 Grails 1.1 起),您通常不应将其配置为急切获取,除非您遇到某些问题。如:

  • 跨不同的休眠会话共享域实例(例如,将域类实例放入 http 会话范围并从中访问属性 - 例如用户)
  • 访问布局/视图中的域类实例时获取 LazyInitializationException
  • 当您确定每次(或大部分时间)获取实例时,您将访问某个关系属性,配置此关系以进行急切获取也是有意义的。

在处理大型数据库时,急切获取可能非常危险。想象一个像这样的域类:

// really bad example
class TreeNode {

   String name            

   TreeNode parent

   static hasMany = [ childNodes: TreeNode ]

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

}

当您读取任何 TreeNode 实例时,它会自动将域类的所有其他实例从数据库中拉到您的内存中。当有足够的实例时,您可能会通过仅获取 1 个实例来杀死您的应用程序。

于 2009-03-17T15:56:53.900 回答