有关hibernate相关的延迟加载和缓存机制

来源:互联网 发布:使命召唤4mac迅雷下载 编辑:程序博客网 时间:2024/06/05 10:16
1、延迟加载:
当真正需要数据时才从数据库中加载,目的就是为了提高执行效率
注意:当加载延迟加载的数据时,如果Session关闭,那么就会出现no session的异常,从而导致延迟加载的数据
无法加载

2、延迟加载分类:
1、实体级别的延迟加载
<class lazy="true|false">,只对load方法有效
2、集合关联属性的延迟加载
<set lazy="true|false|extra">
集合属性延迟加载对于程序的性能提升最为明显。

建议使用lazy="extra"提高集合属性的效率,功能除了具备lazy="true"功能外,还可以根据对集合属性不同操作
  发送不同的sql语句,比如调用集合属性的size、isEmpty方法时,它会发送select count(*)

3、单端关联属性的延迟加载
<many-to-one lazy="proxy|no-proxy|false">

4、普通属性的延迟加载
<property lazy="false|true">

3、抓取策略:
用于定义怎么去获取关联属性

在关联属性的标签中都一个属性fetch,通过fetch属性指定关联的对象怎么取
<many-to-one fetch="select|join"> 默认的fetch="select" 
如果设置为fetch="join",使用左外连接将主体和关联对象立即加载出来,只对get和load方法,在hql语句需要立即抓取关联属性通过fetch关键字
<one-to-one fetch="join|select"> 
<set fetch="select|subselect|join">
如果设置为fetch="subselect",如果使用get或者load方法加载主体对象,那么发送查询语句,如果HQL语句查询主体对象,关联对象通过子查询抓取

batch-size : 有效的减少1+n产生的sql语句
4、缓存:
什么是缓存:应用程序维持的内存,内存中放置一些常用的数据,以便提高程序读取数据效率

5、缓存的分类:
事务级别的缓存:
适用于经常被不同线程进行删除或者修改操作数据,事务级别的缓存适用于单线程环境
Session级别的缓存 就是事务级别的缓存,或者叫做一级缓存

应用程序级别:
不经常修改的通用性数据放置到应用程序级别的缓存中,让多个事务共享这些数据
SessionFactory级别的缓存 就属于应用程序级别的缓存,或者叫做二级缓存

集群级别:
集群环境下,不同服务器上的应用程序如果维持自己的缓存,那么就会导致集群中多个服务器之间的缓存数据无法同步,就需要集群级别缓存
集群环境下的缓存服务器程序:redis 


6、hibernate中的缓存
1、一级缓存:Session级别的缓存,在hibernate中Session级别缓存已经由hibernate,一级缓存中的数据控制由hibernate自行维护,
不需要开发人员设置、维护。一级缓存中只能保存持久化状态的实体对象 。hibernate提供了两个方法可以让开发人员对一级缓存进行有限的管理

void flush() 刷新缓存,强制将缓存中数据和数据库中数据进行同步
void clear() 清空缓存

2、二级缓存:SessionFactory级别的缓存,在hibernate默认并没有开启二级缓存,hibernate也没提供可以应用到企业级开发环境的缓存实现
所以在hibernate如果需要使用二级缓存,应用选择hibernate支持的第三方的缓存实现,然后开启二级缓存

二级缓存中只能放置实体对象,而且是那些不经常修改并且经常被多个Session访问的数据应用放置到二级缓存



7、如何使用二级缓存
1、选择hibernate支持的第三方缓存实现,构建到我们项目中
2、配置缓存、并且在hibernate的配置中启用二级缓存
1、将ehcache的配置文件ehcache.xml放置到当前项目的src下
2、在hibernate.cfg.xml中开启二级缓存,并且指定二级缓存的提供商
   <!-- 开启二级缓存 -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <!-- 指定二级缓存提供商 -->
        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
        
3、在hibernate映射文件中指定哪些实体需要使用二级缓存,并且指定二级缓存的使用策略
在使用二级缓存的实体映射文件中加入<cache usage="read-only|read-write"/>




原创粉丝点击