您的位置:首页 > 其它

传智播客学习之Hibernate性能优化

2010-01-31 20:34 309 查看
前面学习了Hibernate的基本配置,个人觉得Hibernate的精华在于它的性能优化,今天重点总结一下Hibernate性能优化方面的知识.
一、延迟加载
1.概述
Hibernate主要是通过代理机制来实现延迟加载的,他的具体过程是,Hibernate从数据库获取某一个对象数据时,获取某一个对象的集合属性值时,或者是某一对象关联的另一对象时,由于没有使用该对象的数据(除对象标识符)Hibernate并不从数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性为默认值,只有在真正想需要使用该对象的数据时才创建这个真实的对象,真正从数据库中加载他的数据。
注意:get方法默认立即加载。
2.关闭延迟加载
由于有时我们根据业务需要需要立即加载,那么我们可以在配置文件中启用和关闭延迟加载功能。
1) 加载单个个体,用session的get()方法
2) 加载某个实体,对集合属性设置,设置集合属性元素的lazy属性
3) 加载某个实体,对关联的另一个实体,设置many-to-one或者one-to-one的lazy属
4) 大对象延迟加载,只需要在property元素中设置lazy属性就可以了
二、抓取策略
1.单端关联
这主要是设置fetch属性。他有两个可选值。
Select:默认,当需要使用到关联对象的数据时,另外单独发送一跳select语句抓取当前对象的关联对象的数据,即延迟加载
Join:同一个select语句使用外连接来获得对象的数据和他关联对象的数据,此时关联对象的延迟加载失效。
2.集合属性
在集合属性的映射元素上加fetch属性,有三个可选值
Select:默认,当需要使用到关联对象的数据时,另外单独发送一跳select语句抓取当前对象的关联对象的数据,即延迟加载
Join:同一个select语句使用外连接来获得对象的数据和他关联对象的数据,此时关联对象的延迟加载失效。
Subselect:另发一条查询语句或子查询语句抓取前面查询到所有实体对象关联集合。
三、缓存的管理
1.一级缓存的管理
一级缓存即session.Session级别的缓存一般是由Hibernate自动管理的,一般情况下无需进行干涉。当用session的crud以及调用list(),itererate(),filter()方法,如session还没有相应对象,会将对象加入session缓存中。Hibernate会根据缓存中对象的状态变化同步数据库中的数据状态,关闭session,会清空session中所有对象。
Session提供两个手动管理一级缓存的方法,即evict和clear方法。
2.二级缓存的管理
二级缓存是可配的插件,可用于进程/集群范围缓存.他们缓存都是状态(按值返回), 而不是真正的持久化对象.对于特定的数据项来说缓存的并发策略定义了事务的隔离细节.每个类或者每个集合的二级缓存是可选可配的.每个缓存都使用了自己的缓存区域.

1) 适合二级缓存的类的特征:
l 很少改变
l 不共享的本地数据
l 不重要的数据
l 对象数量很少
l 被很多类引用
l 很少被更新
2) 二级缓存安装需要两步:
1、决定使用哪个缓存并发策略
<class name="auction.model.Category“ table="CATEGORY">
<cache usage="read-write"/>
</class>
2、配置缓存过期和物理缓存属性(cache provider)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: