Hibernate3.x教程(五) Hibernate性能优化小结
来源:互联网 发布:htc数据连接不可用 编辑:程序博客网 时间:2024/05/16 02:38
不可否认,Hibernate是一个优秀的ORM框架,但是它的性能也总是受人诟病。在前文之中也提到了一些性能优化方案,现在对这些方案还有其他常用的优化技巧做一下总结。
1、对于one-to-many、many-to-many类型的关联映射优化
a、如果能够通过程序解决,尽量不要用这类关联关系映射
b、建议不要使用级联操作
c、将控制权交给many的一方管理,即设置invers="true"
2、集合使用
对one-to-many的关联,习惯性的都会使用set集合存储。除了set,它还支持list、map、bag等标签。
a、对于存在级联更新的情况,可以使用list、map、set存储,前两者是有序集合,他们在级联更新时效率是最高的。bag是无序集合,级联更新需重建集合,效率很低。
b、只是用于查询的反向集合(设置invers="true"),使用bag和list的效率最高。bag和list标签,都是使用List集合存储,区别在于list是有序集合,需要维护元素的索引位置,而bag无序考虑索引位置,所以仅对于检索的情况,使用bag将会更加灵活,如果需要对元素排序,使用order-by属性即可。
list标签示例:使用list标签,需要在student表中额外增加position字段,维护元素顺序(很难用的东西)
<listname="students"inverse="true">
<keycolumn="grade_id"not-null="true"/>
<indexcolumn="position"/>
<one-to-manyclass="com.boya.hibernate.entity.Student"/>
</list>bag标签示例:
<bagname="students"order-by="id desc"inverse="true">
<keycolumn="grade_id"/>
<one-to-manyclass="com.boya.hibernate.entity.Student"/>
</bag>这两种标签都可以在实体类中这样映射:
private List<Student>students;
3、使用延迟加载属性,设置lazy="true"
设置延迟加载可以在程序真正使用对象时再从数据库调用,可以避免一些无用的数据库查询操作。
使用延迟加载时,需注意以下几点:
a、Hibernate3.x版本的lazy属性默认是true
b、lazy属性只在session打开的情况有效,session关闭后lazy会无效
c、get、load的区别:
get不支持延迟加载,load支持延迟加载
当数据库不存在指定数据时,get返回null,load会抛出异常
d、在web应用中,如果在页面中是无法获取lazy加载的对象的,因为session已经关闭。如果你是集成Spring框架的话,这个问题可以使用Spring提供的OpenSession in View模式来解决。
总的来说,使用延迟加载也是一个很好的提升性能的方案。
4、使用投影查询
对较大的表,如果只是用部分字段可以使用投影查询,这样可以节省部分性能。
5、缓存使用
在之前的文章中,缓存基本使用已经介绍的较为详细了。总之,要熟悉各个缓存的优劣之后,再去使用它,不然,反而会影响应用的性能。
对于查询缓存要慎用之,二级缓存要选择合适的情景使用。
6、复杂业务查询可以使用Native SQL方式,但要注意其可能产生的问题
a、执行本地SQL无法使用Hibernate缓存,在使用了二级缓存的情况下,执行更新删除操作时,同样也无法被缓存感知,这样会造成缓存与数据库不一致。
b、使用本地SQL查询无法自动映射实体对象,它会返回一个数组集合,就像使用jdbc一样,我们需要对各个属性值逐个获取。代码量极大,并且容易出错。
c、拼写本地SQL语句慎用select * 子句,这样很容易因为数据表结构的变更而导致程序错误。
- Hibernate3.x教程(五) Hibernate性能优化小结
- Hibernate3.x教程(二) Hibernate关联映射
- Hibernate3.x教程(四) Hibernate查询方式
- Hibernate3.x教程(三) Hibernate缓存介绍
- Hibernate3.x教程(六) Hibernate常用注解
- Hibernate3.x教程(一) Hibernate介绍及配置
- Hibernate3学习笔记(12)——Hibernate的性能优化
- 《妙解Hibernate3.x》读书笔记二-运行Hibernate
- javascript性能优化小结
- 数据库性能优化小结
- iOS性能优化小结
- web性能优化小结
- Android性能优化小结
- android性能优化小结
- Android性能优化小结
- Hibernate下创建SessionFactory(hibernate3.x与hibernate4.x)
- 性能优化(五) - 容器
- hibernate查询性能优化
- 度量值与管理距离
- [raspberry pi] 如何设置WIFI连接
- C++编程思想读书笔记(1) - 堆和栈
- 详解C++中的virtual
- SIP协议中的一些混淆概念
- Hibernate3.x教程(五) Hibernate性能优化小结
- 创建表空间,创建用户,分配表空间,导入导出数据库;
- 模板匹配实现的(简易)五子棋单步估值算法
- 结构体应用
- 解密module_init
- 为何茶会带有其周围植物的香味?
- 物流与快速的区别
- lua __index __newindex upvalue 示例
- syntax error : missing ';' before 'type'