`
yueguangyuan
  • 浏览: 332965 次
  • 性别: Icon_minigender_1
  • 来自: 新加坡
社区版块
存档分类
最新评论

JavaEye活动记实 Gavin King见面会以及Robbin Hibernate性能调优

阅读更多

4月19日,如期赶到交大参加GavinKing的见面会,上次参加JavaEye的活动还只是在视频上看到Gavin,当时他语速很快,而且有些含混的地方,不知道这次面对面会是个啥样子。
JavaEye还是真厉害,给我们提供这样的机会与Hibernate之父见面,羡煞旁人哦,呵呵。

活动分4个部分:Gavin的演讲、Robbin的Hibernate性能调优、曹晓钢有关JBoss Seam的介绍、Gavin King答疑

一、Gavin演讲

      本来我是用手机录的视频并想拿回来给大家分享的,但是没想到手机突然没电,而录的30分钟视频完全丢失,真是无比郁闷的!
     Gavin说话比较快,而且偶尔也会说的很模糊,对于听力不怎么灵光的我来说实在是有难度。所以仅仅是听懂了大体的意思。
     Gavin打开Hibernate官方网站www.hibernate.org然后逐一演示几个关键的开源软件:hibernate core,hibernate annotations,hibernate entity manager等等。感觉介绍都是比较大略的(主要是我能听懂的也不多),介绍hibernate的时候讲到Hibernate和JPA的使用,但是 JPA我没使用过,他说今后使用Hibernate的时候可以更多的使用JPA而不用使用Hibernate;讲到Hibernate Annotations的时候问大家配置Hiberante是使用schema还是annotations,看到使用Annotations用的少的时 候,说建议大家尝试使用,但是这个目前为止并没有被大家所认可,所以是否使用还有待观察哦;接下来讲的entitymanager、shard、 validator、search、tools我都没有使用过,听了他的介绍以后也只是简单了解一下,是否使用就要看以后有没有相应的需求了。有趣的是 Gavin还提到了Spring,说大家使用Spring+hibernate的时候都会遇到延迟加载的问题吧,但是大家都没怎么听懂,后来robbin 在下面现场翻译了一下,才多了几个人举手,Gavin说应该会有很多人碰到的,而EJB3不会碰到,呵呵。

     其实Gavin此次来中国主要是为Radhat推广JBoss Seam,在北京说他讲了一天时间,因为那次是商业活动,而到了上海是JavaEye的社区活动,加上他刚刚出了一次小车祸,所以在上海只讲了一个小时,其中有20分钟是介绍JBossSeam的,同样令我摸不到头脑。介绍JBoss Seam,Gavin很有信心,而且好像很努力的在讨好SUN,希望能加入JEE标准中,因为他相信在EJB2时代不被看好的Hibernate已经上 位,而Seam也可能走这条路。接下来进行了介绍,还讲解官方网站上的Demo,但是由于网络延迟太严重,他还在演讲台上做了一个原地的跳动来模仿鼠标等 待的样子,相当的搞笑。接下来的回答问题环节,一位同学提到了ROR,说Hibernate是如何来应对Convention over configuration的挑战呢?结果引起Gavin的剧烈反应,Gavin显示出对ROR的不削,而且还说EJB在几年以前就有COC的理念了, ROR还嫩的很,随即还即兴写了一小段代码来掩饰EJB3中如何使用annotations来实现COC,他的回应赢得满场的掌声。整个演讲持续一个多小 时,而我还损失了30分钟的真人视频 :(。Robbin说Gavin受了两年的成名的考验以后,显然比原来更适应大场面,演讲声音很大,吐字也清晰了许多,自信心也很足,经常做一些很古怪的 表情,还时不时的做出经典的兔子手势来表达他的意思。可以说他的演讲还是很值得一听的。

      但是总体想起来,Gavin貌似已经走进一个漩涡,那么就是标准。估计在整个下午(演讲1个小时和对几个人的回答)估计他说了10次“Standard”这个词,在他眼里标准已经占据了一切,有人问,使用Hibernate和JPA,你有什么看法?他会说我不在意,他们都是标准。一切尽在标准中,他无视Spring、ROR的强有力挑战,甚至想将JBoss Seam这样的东西纳入JSF、EJB阵营。他如此走下去真是难以让人对他重现Hibernate的惊世之作有更多的期待。

二、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的开发人员有着很重要的点拨作用。非常感谢他无私奉献自己的经验。

三、曹晓刚对于JBoss Seam的介绍

     曹大侠又一次露面了,首先的感觉就是他比上次JavaEye的活动瘦了些,更帅了 :)。而且在演讲席间,是他一直与Gavin进行着交流,这位满江红的创办者之一,想必他的英语水平和他的技术水平一样的强。他说目前满江红正在进行JBoss Seam文档的中文翻译工作,进度为50%。而此次演讲的内容是介绍JBoss Seam,但是由于JBossSeam刚刚走向市场推广,国内也鲜有应用,其实全球来讲也没有什么大规模的成功案例,所以他的演讲也使得大家有点陌生。而且他说自己也是在学习阶段,呵呵。感觉上这次介绍不如上次JavaEye活动中他给我们带来的基于Ajax开源报表项目有吸引力,但是也具备一定的价值。

     通过Gavin和曹晓刚的介绍,JBoss有啥好处我并不大了解,以及它是否具有挑战主流架构模式都有待检验,但是我得到一些简单的结论:JBoss Seam现阶段我们还不需要花时间去了解。

     原因有一下几点,实际上就是曹晓刚介绍的东西:

     1.JBoss Seam引入了一个全新的概念:declared state,就是在传统的HTTP存储对象的组件外又加入了Conversation这个东西。(这里记录好像有错误,因为我对JBoss Seam一无所知)
     2.JBoss Seam目前只支持JSF,可能是JBoss团队以Gavin为首想讨好SUN和众多大厂商吧,居然紧密结合JSF,JSF多年来日子都没好过过,不知道Seam这样搞是为了啥。
     3.JBoss Seam添加了众多组件的支持,比如Ajax支持、Captcha支持、类似于Rails的Gen支持。说50行就可以完成一个什么实现的。
     4.BiInjection(双向注入依赖,一个Seam的创新,也值得质疑的东西) and contextual are the soul of Seam,这是一个Seam的开发者对Seam的总结,但是这两个东西都难有说服力,不知道什么样的场景需要大量使用到他们,特别是双向关联,可能会造成相当大的迷惑哦。

一个非常精彩的技术之旅,感谢JavaEye提供这样的好机会,也感谢Gavin精彩的演讲 :P。

分享到:
评论
2 楼 shaka 2009-02-13  
很受启发,顶了
1 楼 strive4l 2007-09-26  
谢谢小月的总结和分享...

相关推荐

Global site tag (gtag.js) - Google Analytics