当前位置:  开发笔记 > 编程语言 > 正文

Grails/GORM默认提取策略:何时将fetchMode设置为"eager"?(渴望与懒惰)

如何解决《Grails/GORM默认提取策略:何时将fetchMode设置为"eager"?(渴望与懒惰)》经验,为你挑选了1个好方法。

什么是关于何时在域类中将fetchMode设置为"eager"的一般指导原则?fetchMode"eager"与默认"懒惰"的优缺点?

请包含一些特定示例/用例,显示何时使用"eager"(fetchMode = eager),何时不使用(fetchMode = lazy).



1> Siegfried Pu..:

基本上延迟加载比急切的替代(性能,资源的使用)有更多的好处.因为它是所有关系的默认grails设置(自Grails 1.1以来),除非遇到某些问题,否则通常不应将其配置为急切提取.如:

在不同的hibernate会话中共享域实例(例如,将域类实例放入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个实例来杀死应用程序.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有