日期:2014-05-18  浏览次数:20726 次

hibernate疑问:关于07年hibernate之父GavinKing来javaeye时Robbin演讲时提出的使用hibernate的建议
本帖最后由 senlinmuvs 于 2013-03-15 20:18:08 编辑
==========以下是Robbin的总结(来自于iteye的一个帖子)=======================
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的总结(来自于iteye的一个帖子)=======================


我的问题来了:
我的问题主要是要怎么理解上面的那些。下面以以上7点来一个个说明我的问题或我的理解:
1.这个好理解。单项one-to-many将导致发额外的update来维护关系。成本高。
2.怎么灵活用one-to-many?
3.虽然一直是这么用的,但不知道为什么?
4.为什么不用集合缓存?什么情况下用,什么情况下不用?
5.Why?我之前好像都是用set,除非需要保持用序就用list(映射为bag)
6.这个我不知道“继承使用显示多态”是什么意思
7.这个理解,就是消除冗余字段,细分表,来细粒度缓存,以增加缓存的命中率和应用场景

以上我的理解中如有不对或补充的地方望提出。。。。
hibernate 框架 性能优化 java

------解决方案--------------------
目测沉了。。。。。。