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 * 子句,这样很容易因为数据表结构的变更而导致程序错误。
原创粉丝点击