`
jordan421
  • 浏览: 4441 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Robbin倾力奉送Hibernate性能调优--转

阅读更多

文章分类:Java编程

Robbin倾力奉送Hibernate性能调优

     个人认为这个绝对是Robbin压箱底的作品(因为很激动能邀请到Gavin参加他主办的活动),但是Robbin还是很谦虚的首先声明:在Gavin面前谈Hibernate真是班门弄斧,所以是拿出来和大家探讨,而当晚就有针对其演讲中如何避免N+1问题的讨论(http: //www.iteye.com/post/266972),足见Robbin演讲受欢迎的程度。

     由于Robbin为了抢时间,所以他讲的比较快,我也是急急忙忙的记笔记,但是他所总结的东西已经让我了解到了很多东西,原来我对Hibernate的了解还是那么少:(。

Robbin总结的Hibernate性能优化要点:

1.尽量使用many-to-one,避免使用单项one-to-many
2.灵活使用单向one-to-many
3.不用一对一,使用多对一代替一对一
4.配置对象缓存,不使用集合缓存
5.一对多使用Bag 多对一使用Set
6.继承使用显示多态  HQL:from object  polymorphism="exlicit" 避免查处所有对象
7.消除大表,使用二级缓存
    对于上面这些,Robbin进行了详细的讲解。
one-to-many:
     使用inverse=false(default),对象的关联关系是由parent对象来维护的
     而inverse=true的情况下,一般用户双向多对多关联,由子对象维护关联关系,增加子对象的时候需要显示:child.setParent(child)
     为了提高性能,应该尽量使用双向one-to-many inverse=true,在MVC结构中的DAO接口中应该直接用Session持久化对象,避免通过关联关系(这句话有点不理解),而在单项关系中正确使用二级缓存,则可以大幅提高以查询为主的应用。
     多对一性能问题比较少,但是要避免经典N+1问题。
     通过主键进行关联,相当于大表拆分小表。(这个是区分面向对象设计和面向过程设计的一个关键点)
list、bag、set的正确运用
     one-to-many:
     A、使用list 需要维护Index Column字段,不能被用于双向关联,而且必须使用inverse=false,需要谨慎使用在某些稀有场合(基本上是不予考虑使用)
     B、bag/set在one-to-many中语义基本相同,推荐使用bag
     many-to-one:
     A、bag和set不同,bag允许重复插入,建议使用set
在庞大的集合分页中应该使用session.createFilter
    session.createFilter(parent.getChildren(),""),setFirstResult(0),setMaxResult(10))
避免N+1 参考(http://www.iteye.com/post/266972)
    在多对一的情况下,查询child对象,当在页面上显示每个子类的父类对象的时候会导致N+1次查询,需要采用下面的方法避免:many-to-one fetch="join|select"(该方法可能有问题)
inverse=true 无法维护集合缓存(还不是很理解集合缓存和对象缓存)
OLTP类型的web应用,可以群集水平扩展,不可避免的出现数据库瓶颈
    框架能降低访问数据库的压力,采用缓存是衡量一个框架是否优秀的重要标准,从缓存方面看Hibernate
    A、对象缓存,细颗粒度,是针对表的级别,透明化访问,因为有不改变代码的好处,所以是ORM提高性能的法宝
    B、Hibernate是目前ORM框架中缓存性能最好的框架
    C、查询缓存
最后Robbin还针对大家经常出现的Hibernate vs iBatis的讨论进行了一个总结:
   对于OLTP应用,使用ORM框架 而OLEB应用(不确定是什么应用)最好采用JDBC或者其他方法处理
   Hibernate倾向于细颗粒度设计,面向对象,将大表拆分为多个小表,消除冗余字段,通过二级缓存提升性能。
  iBatis倾向于粗颗粒度设计,面向关系,尽量把表合并,通过Column冗余,消除关联关系,但是iBatis没有有效的缓存手段。

   可以说Robbin的性能总结对于使用Hibernate的开发人员有着很重要的点拨作用。非常感谢他无私奉献自己的经验。
分享到:
评论

相关推荐

    javaeye Robbin 论缓存技术

    - 对于数据库缓存,可以通过MySQL的`show status`命令、mysqlreport脚本、MySQL Administrator工具或者专门的innotop工具来监控和分析缓存的使用情况,进行性能调优。 总结来说,缓存技术在现代软件系统中扮演着至...

    MFC SDI制作Office2007样式的Robbin菜单.docx

    ### MFC SDI 制作 Office 2007 样式 Robbin 菜单 #### 一、概述 Microsoft Foundation Classes (MFC) 是一个由微软开发的类库,用于简化 Windows 应用程序的开发过程。本文档旨在介绍如何在 MFC 单文档界面...

    Git常用命令备忘 - robbin的自言自语1

    git config --global user.name "robbin" git config --global user.email "fankai@gmail.com" git config --global color.ui true ``` 设置别名,如`co`为`checkout`,`ci`为`commit`,`st`为`status`,`br`为`...

    范凯个人网站源码robbin_site.zip

    robbin_site 是范凯的个人网站 http://robbinfan.com 网站的源码。 标签:robbin

    Robbin Fan—运营专业型社区的经验和反思.ppt

    Robbin Fan—运营专业型社区的经验和反思.ppt

    开发高效率的J2EE企业应用.ppt

    总的来说,开发高效率的J2EE企业应用需要对JVM内存管理、数据库资源利用、网络通信和事务处理有深入理解,并充分利用各种工具进行性能监控和调优。通过不断学习和实践,开发者可以提高应用性能,确保大型项目的稳定...

    Linux平台gcc

    -rwxr-xr-x 1 robbin users 11939 2008-11-02 13:48 hello ``` 该文件大小约为11KB。 ##### 2. 查看动态链接库 通过`ldd`命令可以查看该程序所依赖的动态链接库,例如: ```sh ldd hello ``` 输出结果可能类似...

    Struts2学习资料(强烈推荐)

    4. ** strut2与其它技术集成**:例如,与Hibernate或MyBatis的持久层集成,以及与Spring框架的深度整合,实现服务层和DAO层的管理。 5. **安全考虑**:学习防止SQL注入、XSS攻击等安全问题的方法,以及如何使用...

    Ribbon For DELPHI 10.1 BERLIN.7z

    《Ribbon for Delphi 10.1 Berlin:构建现代用户界面的新篇章》 在软件开发领域,Delphi作为一款强大的RAD(快速应用开发)工具,一直以来都深受开发者喜爱。而Ribbon界面设计则是在微软Office系列软件中广泛应用的...

    互联网程序员都每天刷题嘛-lean-spring-cloud:瘦春云

    独立配置Robbin负载均衡 -Xms128m -Xmx128m 1.系统架构演变 随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是技术上的压力。系统架构也因此也不断的演进、升级、迭代。从单一应用,到垂直拆分,到...

    spring cloud 组件整合 eureka gateway feign hystrix,各个模的整合,供大家一起学习

    在Spring Cloud生态系统中,Eureka、Gateway、Feign和Hystrix是四个核心组件,它们协同工作以构建出高可用、高性能的微服务架构。让我们深入探讨这些组件以及它们如何整合。 1. **Eureka**:Eureka是Spring Cloud中...

    Fundamentals of Calculs - Crowell et al - 2016-计算机科学

    book by Joel Robbin and Sigurd Angenent, www.math.wisc.edu/undergraduate/calculus-instructors-page.www.lightandmatter.comFullerton, California www.lightandmatter.comCopyright 2006 Sigurd B. Angenent, ...

    SpringCloud1.pdf

    - 独立配置Robbin负载均衡 # 1.系统架构演变 随着互联网的发展,网站应用的规模不断扩大。需求的激增,带来的是技术上的压力。系统架构也因此不断的演进、升级、迭代。从单一应用,到垂直拆分,到分布式服务,到...

    Regular-Expressions-Google-Analytics

    (y|i)`这个正则表达式去匹配名字"Robbin"时,`robb?(y|i)`就是正则表达式,而"Robbin"就是目标字符串。 ### 实践中的应用 一旦掌握了正则表达式的基本原理,就可以开始在谷歌分析中实践。从简单的字符串匹配到复杂...

    freemarker总结

    JAVA模版引擎Freemarker常用标签(一) 1. if指令 这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: <#if condition>... <#elseif condition>... <#elseif condition>......

    git常用命令保存快速使用

    * `git config --global user.name "robbin"`:设置用户名 * `git config --global user.email "fankai@gmail.com"`:设置邮箱 * `git config --global color.ui true`:设置 Git 输出颜色 * `git config --global ...

Global site tag (gtag.js) - Google Analytics