gpt4 book ai didi

Grails/GORM 默认获取策略 : When to set fetchMode to "eager"?(急切与懒惰)

转载 作者:行者123 更新时间:2023-12-02 01:21:17 24 4
gpt4 key购买 nike

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

请提供一些具体的示例/用例,说明何时使用“eager”(fetchMode=eager),何时不使用“eager”(fetchMode=lazy)。

最佳答案

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

  • 在不同的 hibernate session 之间共享域实例(例如,将域类实例放入 http session 范围并从中访问属性时 - 例如用户)
  • 访问布局/ View 中的域类实例时出现 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 个实例来终止应用程序。

关于Grails/GORM 默认获取策略 : When to set fetchMode to "eager"?(急切与懒惰),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/654704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com