Hibernate性能调优

我们先看一下常见的一个问题:inverse = ?

我们考虑两种状况:
inverse=false(default)
1、用于单向的1对多关联
2、parent.getChildren().add(child) 插入子对象
3、parent.getChildren().delete(child) 删除子对象

inverse=true
1、用于双向的1对多关联
2、child.setParent(parent);  session.save(child) 插入子对象
3、session.delete(child) 删除子对象

在分层结构的体系中,parentDao,childDao对于CRUD的封装导致往往直接通过session接口持久化对象,而很少通过关联对象可达性。

在考虑Hibernate性能过程中,我们还要考虑1对多关系

单向关系还是双向关系?
1、parent.getChildren().add(child)对集合的触及操作会导致lazy的集合初始化,在没有对集合配置二级缓存的情况下,应该避免此类操作。
2、select * from child where parent_id = xxx

这种情况下,我们考虑的性能的要点有;
1、一般情况下避免使用单向关联,尽量使用双向关联。
2、使用双向关联,采用inverse=true
3、在分层结构中通过DAO接口用session直接持久化对象,避免通过关联关系进行可达性持久化。

多对1关系
单向多对1关系表达了外键存储对象
灵活运用多对1可以避免一些不必要的性能问题
多对1的表达的含义是:0..n:1,多可以是0,可以是1,也可以是n。

1对1
通过主键进行关联
相当于把大表拆分成功多个小表
例如把大字段单独拆分出来以提高数据库性能
Hibernate的1对1无法lazy,必须通过bytecode enhancemant

集合List、Bag、Set
1对多的情况下:
1、list需要维护index column,不能被用于双向关联,必须inverse = false,被谨慎的使用在某些稀有的场合
2、Bag/Set语义上没有区别
3、推荐使用Bag

多对多情况下:
1、Bag/Set语义有区别
2、建议采用Set

集合的过滤
1、children = session.createFilter(parent.getChildren(), “where this.age > 5 and
this.age < 10”).list()
针对一对多关联当中的集合元素非常庞大的情况下,特别适合于庞大集合的分页

2、session.createFilter(parent.getChildren(),
“”).setFirstResult(0).setMaxResults(10).list();


继承关系当中的隐式多态
1、HQL:from Object
1.1、将把所有数据库表全部查询出来
1.2、polymorphism=“implicit”(default)将当前对象,和对象所有继承子类全部一次性取出
1.3、polymorphism=“explicit”只取出当前查询对象

Hibernate二级缓存
著名的N+1问题:from child,然后在页面上面显示每个子类的父类信息,就会导致N条对parent表的查询:
select * from parent where id = ?
解决方案:
1、eager fetch
2、二次缓存

Hibernate二级缓存是提升WEB应用性能的法宝
OLTP类型的Web应用,由于应用服务器端可以进行群集水平扩展,最终的系统瓶颈总是逃不开数据库访问。什么框架能够最大限度减少数据库访问,降低数据库访问压力,哪个框架提供的性能就更高;

针对数据库的缓存策略:
1、对象缓存:细颗粒度,针对表的记录级别,透明化访问,在不改变程序代码的情况下可以极大的提升WEB应用的性能。对象对于ORM非常关键。
2、对象缓存的优劣取决于框架实现的水平。开源框架中Oracle TopLink对象缓存最强大。
3、查询缓存:粗颗粒度,针对查询结果集,应用于数据实时化要求不高的场合。

选择:
1、Hibernate:倾向于细颗粒度,面向对象,大表拆分为小表,消除冗余记录,通过二级缓存提升性能,DBA很忌讳关联关系的出现,但是ORM的缓存将突破关联关系的性能瓶颈,Hibernate的性能关键不在于关联关系,而在于对大表的操作。

2、iBATIS:倾向于粗颗粒度设计,面向关系,尽量把表合并,通过表记录冗余,消除关联关系,没有有效的缓存手段。iBATIS的性能关键不在于大表操作,而在于关联关系。

3、TopLink:倾向于粗颗粒度设计,面向关系,具备有效但很复杂的缓存手段,其缓存还可以和Oracle数据库RAC进行有效参数关联,对DBA非常有效。但是掌握复杂。在开源前是最有效的商业ORM

3、JPA:J2EE 5的新技术,其设计者就是Hibernate的设计者。属于可以和Hibernate复用的新方法。借鉴了Hibernate的优势,同时加入了很多支持J2EE其他标准及协议的特性。值得关注。由于是SUN标准的ORM,所以势必得到中间件厂商的大力支持。对于中大型项目来说,采用它可以很好的利用各个中间件厂商的技术资源和技术支持来解决实际开发中的问题,甚至是Hibernate问题。而且如果前先采用Hibernate,未来迁移JPA可以非常平滑。

4、SAP:商业产品、非常强悍,位于SAP NetWeaver技术平台。但是昂贵。建议可以有机会学习就不要放过。

你可能感兴趣的:(oracle,Hibernate,ibatis,orm,jpa)