我们先看一下常见的一个问题: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技术平台。但是昂贵。建议可以有机会学习就不要放过。
分享到:
相关推荐
### Hibernate 性能调优详解 #### 一、概述 Hibernate 是一款优秀的 Java 持久层框架,它简化了数据库操作,使开发者能够更加关注业务逻辑而不是底层的数据访问细节。然而,在实际应用中,为了确保应用的高性能与...
珍藏的hibernate性能优化,如果对hibernate进行优化,很详细,是工作和面试的好助手
### Hibernate的开发注意项与性能调优 在长期的软件开发过程中,Hibernate作为一款流行的ORM(对象关系映射)框架,被广泛应用于Java项目中。然而,在实际的应用场景下,如何进行性能调优是一个非常重要的话题。...
书中会分享一些实用的Hibernate性能调优策略,包括查询优化、缓存配置、连接池选择等。 10. **最佳实践与案例分析**:通过真实项目案例,书中将展示如何在实际开发中有效地运用Hibernate,以及遵循的一些最佳实践,...
"Hibernate性能调优指南"是开发者不可忽视的部分,它提供了很多关于优化查询性能、减少内存消耗、提升并发处理能力的建议。例如,理解懒加载与即时加载的区别,合理设置缓存策略,以及避免N+1查询问题等。 此外,...
8. **Hibernate性能调优**:讨论如何优化查询性能,减少数据库访问次数,以及合理设置缓存策略等。 9. **Hibernate与Junction(或其他框架)集成**:例如,如何将Hibernate与其他Java框架如Spring整合,实现更高效...
13. **性能优化**:分享一些实用的Hibernate性能调优技巧,如批处理、缓存利用、避免N+1查询问题等。 通过这份《Hibernate学习笔记》,读者将能全面了解Hibernate的基础知识,并具备实际项目开发中的应用能力。对于...
《Hibernate性能优化》 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着应用规模的扩大,性能问题逐渐显现,因此对Hibernate进行性能优化变得至关重要。本篇...
《Hibernate性能优化共9页.pdf》的压缩包文件聚焦于Java开发中的一个重要框架——Hibernate的性能调优。Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作,但同时也可能带来性能问题。以下...
通过将`hibernate.show_sql`属性设置为`true`,可以查看Hibernate执行的所有SQL语句,这对于调试和性能调优非常有帮助。不过需要注意的是,在生产环境中应谨慎使用此选项,以免影响性能。 #### 十、综合优化技术栈 ...
### Hibernate性能:性能、规模与风险初评 #### 一、引言 随着软件系统的不断发展,数据持久化技术成为现代应用程序不可或缺的一部分。其中,Hibernate作为一款流行的Java ORM(Object Relational Mapping)框架,...
"Hibernate性能调优"则可能是关于如何优化Hibernate使用,提高应用性能的指南;"大型高并发高负载网站的系统架构解决之道"可能探讨了在高并发场景下,如何设计和优化系统架构,这对理解和应对大型Web应用的挑战非常...
《JBoss性能优化整合》是一份深度探讨Jboss应用服务器性能提升的重要资料,它集结了作者反复试验与研究的心得,旨在为...无论你是初学者还是经验丰富的开发者,都能从中获得宝贵的性能调优知识,为你的项目保驾护航。
10. **性能优化**:讨论Hibernate性能调优的策略,例如批处理、延迟加载的控制、避免N+1查询问题等。 这门课程不仅适合初学者,也适用于有一定经验的开发者,帮助他们深入理解Hibernate的工作原理,提高数据库操作...