`
shinewang
  • 浏览: 36157 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Grails开发笔记 - 立即加载和延迟加载

阅读更多

使用ORM时,常常碰到N+1次查询的问题。Hibernate采用立即加载(eager load)和延迟加载(lazy load)来解决这一问题,GROM建立在Hibernate的基础之上,理论上同样适用。但事实如何?

Grails的官方文档中提到:默认情况下,GORM 集合使用延迟加载的并且可以通过fetchMode来配置或者是使用mapping来配置 。并给出了一段在domain中配置的样例代码。

但从我的使用经验来看,不推荐在domain类中配置延迟加载。原因如下:
1、在domain类中配置延迟加载是全局性的,有可能造成不需要开销。
2、目前在domain类中配置延迟加载存在Bug,只对one-to-many的关系才有效。

例如论坛的列表页面,需要显示topic的分页列表,其中每条topic需要显示作者的名字,topic最后回复帖子的作者。

按照官方文档,可以在Topic类中如下配置,查询结果为1条topic,理论上结果应该执行一条SQL语句:

class  Topic  {
    String title
    String body
    Date createTime 
=   new  Date()
    User author
    Integer viewNum 
=   0
    Integer postNum 
=   0
    Date lastUpdateTime
    User lastUpdateBy
    
static  hasMany  =  [ posts : Post ]
    
static  fetchMode  =  [author: ' eager ' , lastUpdateBy: ' eager ' ]
}

但从SQL Log来看,Grails还是执行了3条SQL:

select    from  topic  where  id = ?
select    from   user   where  id = ?
select    from   user   where  id = ?

也就是说在domain类中配置延迟加载存在对one-to-one, many-to-one是无效的。

如果这样配置:

class  Topic  {
    String title
    String body
    Date createTime 
=   new  Date()
    User author
    Integer viewNum 
=   0
    Integer postNum 
=   0
    Date lastUpdateTime
    User lastUpdateBy
    
static  hasMany  =  [ posts : Post ]
    
static  fetchMode  =  [posts: ' eager ' ]
}

执行Topic.get(id)来加载1条Topic,执行结果为1条SQL:

select    from  topic  left   outer   join  post  on  topic.id = posttopic_id  where  topic.id = ?

也就是说在domain类中配置延迟加载存在对one-to-many是有效的。以上结论对使用mapping来配置也是一样的。

这无疑是一个尴尬的结论,适用全局立即加载的author和lastUpdateBy不能在domain类中通过配置事先,不适用全局立即加载的posts却可以。看来GROM对Hibernate的包装还存在问题。

目前的解决方法是不要在domain类中配置立即加载,而是在取数据的方法中按需要配置,例如Topic.list(fetch:[author:'eager', lastUpdateBy:'eager'])

另外,可以参考一下这里关于立即加载和N+1次查询性能的争论。

分享到:
评论

相关推荐

    grails-fck-editor-0.3.zip_grails_grails-fck-editor

    标题中的"grails-fck-editor-0.3.zip_grails_grails-fck-editor"表明这是一个与Grails框架相关的插件,具体来说是FCKeditor的一个版本。FCKeditor是一款广泛使用的开源富文本编辑器,它允许用户在网页上创建和编辑...

    grails-doc-CN-1.0.rar

    Grails 是一个基于 Java 平台的开源 web 应用框架,它采用了 Groovy 编程语言,使得开发过程更为简洁高效。`grails-doc-CN-1.0.rar` 文件包含的是 Grails 1.0 版本的中文参考文档,对于那些不熟悉英文文档或者想要...

    grails-datastore-gorm-plugin-support-2.0.4.RELEASE.zip

    该版本的插件是针对Grails框架的,Grails是一个基于Groovy语言的敏捷开发平台,以其简洁的语法和高效的开发速度而闻名。 GORM,即Grails Object Relational Mapping,是Grails框架的核心组件之一,它允许开发者以...

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part2

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part2 共两个包,解压后需要将扩展名.zip.bak改名为.zip重新解压。 http://dist.springsource.com/release/STS/3.8.1.RELEASE/dist/ e4.6/spring-tool-...

    grails 中文文档+grails-fckeditor-0.9.5.zip插件

    1. 学习入口:对于中文开发者来说,中文文档降低了学习Grails的门槛,帮助理解和掌握Grails的基本概念、框架结构、开发工具以及最佳实践。 2. 快速上手:文档通常包含安装指南、教程、API参考等,为开发者提供从零...

    grails 开发框架-1

    grails1.0开发框架1 类似于ruby on rails的框架。

    grails 开发框架-4

    grails1.0开发框架4 类似于ruby on rails的框架。

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1 共两个压缩包,解压后将扩展名.zip.bak改为.zip再次解压。

    grails 开发框架-5

    grails1.0开发框架5 类似于ruby on rails的框架。

    grails-docs-2.0.0

    `grails-docs-2.0.0`是Grails 2.0.0版本的官方文档,包含了丰富的指南、API参考以及国际化资源,对于学习和掌握Grails 2.0.0至关重要。 首先,`index.html`是文档的主页,通常会包含目录、介绍性内容以及如何开始的...

    grails-web-url-mappings-2.5.4.zip

    《Grails Web URL Mappings 2.5.4:开源项目的URL路由艺术》 在Web开发领域,路由是连接用户请求与服务器响应的核心机制。在Grails框架中,URL映射(URL Mappings)扮演了至关重要的角色,它定义了应用程序如何响应...

    grails 开发框架-3

    grails1.0开发框架3 类似于ruby on rails的框架。

    grails-docs-1.0

    Grails是一种基于Groovy语言的开源Web应用框架,它简化了Java开发,提供了丰富的功能和强大的工具,深受开发者喜爱。本文将深入探讨grails-docs-1.0版本的API文档,帮助读者更好地理解和使用Grails框架。 首先,...

    Grails入门指南 -- 针对grails1.0.4更新

    ### Grails入门指南知识点 #### 一、Grails框架简介 - **背景**: Grails是一个基于Groovy语言的开源Web应用框架,适用于Java平台。... - 开发者可以期待Grails在未来为企业级应用开发带来更多的创新和便利。

    grails-3.0.5-ga (2/2)

    11. **Testing**: Grails支持单元测试、集成测试和功能测试,提供了一套完整的测试框架,包括Spock用于行为驱动开发的测试库。 12. **Internationalization (i18n)**: Grails 3.0.5支持多语言,通过资源包...

    grails开发环境-1

    grails2.4.4 开发环境描述,包括JDK,STS,GRAILS2.4.4等如何安装使用

    Grails入门指南-中文版

    Grails是一个高效的Web开发框架,它基于Groovy编程语言并构建在Spring、Hibernate和其他Java框架之上。这使得Grails成为一个一站式的解决方案,极大地提高了开发者的生产力。本文将详细介绍Grails的基本概念、核心...

    Grails-2.4.4-用户手册

    Grails 是一个基于 Groovy 语言的开源全栈式Web应用框架,它旨在提高开发效率,提供简洁、灵活的代码结构,以及强大的自动化工具。Grails 2.4.4 是该框架的一个稳定版本,具有以下特性: 1. **Groovy 语言支持**:...

    grails-spring-websocket

    Spring Websocket Grails插件 该插件旨在使Spring 4.0中引入的websocket支持可用于Grails应用程序。 您也可以使用相应的Spring docs / apis / samples作为参考。 在本自述文件中多次提到了这一点,因为其中详细...

    Grails开源框架 - 使用指南

    Grails开源框架 - 使用指南,版本1.0,中文文档。 Grails开源框架 - 使用指南 作者: Graeme Rocher, Marc Palmer 版本: 1.0 Copies of this document may be made for your own use and for distribution to ...

Global site tag (gtag.js) - Google Analytics