Hibernate中一级和二级缓存使用和详解

Hibernate框架中存在3中缓存类型:一级缓存、二级缓存、查询缓存;

一级缓存可用来保存其持久化类的对象,二级缓存和查询缓存可用来提高查询的性能;

(一)一级缓存的认识:

(1)Session对象中所拥有的缓存称为一级缓存,位于该缓存中持久化类的对象都是持久状态;

注意:一级缓存就是一个Map对象,它仅缓存实体对象,其中对象的ID为key,实体对象为value值;

(2)当调用session对象中的save(),saveOrUpdate(),update()方法时,新创建的持久化类对象从临时状态转化为持久状态;

当调用session中的load(),get()方法时,会先从一级缓存中查找,如果有就直接返回,否则就从数据库中检索;

注意:在Web应用程序中使用 getCurrentSession()方法时,就会使得每一个线程独享一个Session对象,这个Sesion缓存中也仅能在当前的线程中使用;当Session关闭后,缓冲也就不存在!

【一级缓存的示例代码】

	//同一个Session,两次load查询
	Student student = (Student)session.load(Student.class,1);
	System.out.println(“student.name = ” + student.name);
	//第二次load,将从缓存中得到数据,不会发出查询语句
	Student student = (Student)session.load(Student.class,1);
	System.out.println(“student.name = ” + student.name);

(二)二级缓存的认识:

(1)二级缓存需经配置才可以使用,二级缓存位于sessionFactory中,可以被多个session共享;二级缓存主要用来提高查询的性能,应用程序中不经常被修改的数据可以放入二级缓存中(比如:公司中人物的职称、超市中商品的类别等);二级缓存中存放的也是实体对象,对象的ID为key,实体对象为value值;

(2)使用二级缓存时,不能通过别的程序或方式来修改数据库中的数据,否则,缓存中的数据库将无法同步更新;

注意如果项目中使用hibernate的二级缓存,那么修改数据务必要通过hibernate来修改;如果使用JDBC代码来修改了数据,那么hibernate框架中的二级缓存永远不知道其缓存中的数据修改,不会自动的去更新,导致缓存中的数据和数据库中的数据不一致,就会出现脏数据的状况!

其次,当保存、更新和删除(删除实体类对象的引用)持久状态对象时,就会自动的将其一级和二级缓存中的对象自动更新!

重点:当根据对象的ID值get或load某对象时,默认先从Session中检索,如未找到,则从二级缓存中查找,还未找到,就从数据库中检索,查询的结果对象会被自动的放入Session缓存和二级缓存中;当保存、更新和删除对象时,二级缓存中的数据就会被自动更新!

(3)Hibernate框架使用二级缓存需要导入的jar包:

二级缓存一般使用第三方产品,常用的二级缓存包是 Ehcache。Ehecahe的jar文件位于\lib\optional\echache目录下;

使用二级缓存需要做如下的配置:

编写Ehcache的配置文件 ehcache.xml;

◆ 在Hibernate.hbm.xml文件中启用二级缓存并配置相关的属性;

◆ 在hibernate.hbm.xml或Entity.hbm.xml设置缓存策略。

(4)ehcache.xml文件的配置如下:

<ehcache>
	<!--  <diskStore path=”user.dir”/>缺省的磁盘缓存,缓存默认在内存里面,存储的是java对象,
	实际需要配置存储java对象在缓存中的最大数量,若超出了,会采用某种算法,将其对象保存在对应的外部磁盘中去!
	(缓存要求性能,存硬盘效率极低,不如在数据库中检索,一般不使用!); -->
    <diskStore path="java.io.tmpdir"/>
    <!-- 默认缓存区 -->
    <defaultCache
        maxElementsInMemory="500"
        eternal="false"
        timeToIdleSeconds="600"
        timeToLiveSeconds="600"
        overflowToDisk="false"
     ></defaultCache>
     
     <!-- 为对象添加二级缓存,不经常变化的类使用二级缓存 (对象默认放在自己提供的缓存区中)-->
     <cache 
     	name="com.xupt.hibernate.entity.ProductEntity"  
     	maxElementsInMemory="1000"
        eternal="false"
        timeToIdleSeconds="600"
        timeToLiveSeconds="600"
        overflowToDisk="false">
     </cache>
     
     <!-- 为对象添加二级缓存,不经常变化的类使用二级缓存(对象默认放在自己提供的缓存区中) -->
     <cache 
     	name="com.xupt.hibernate.entity.TypeEntity"  
     	maxElementsInMemory="1000"
        eternal="false"
        timeToIdleSeconds="600"
        timeToLiveSeconds="600"
        overflowToDisk="false">
     </cache>
 </ehcache>

(5)ehcache.xml文件配置和hibernate框架配置没有任何的关联,独立的xml文件;

<diskStore path=”user.dir”/>缺省的磁盘缓存,缓存默认在内存里面,存储的是java对象,

实际需要配置存储java对象在缓存中的最大数量,若超出了,会采用某种算法,将其对象保存在对应的外

部磁盘中去!(缓存要求性能,存硬盘效率极低,不如在数据库中检索,一般不使用!);

<defaultCache>缺省缓存比较重要,必须配置;

eternal = “true” //设置永久有效,二级缓存不会自动删除,除非编写代码删除!

eternal = “fasle” //不是永久有效,配置了fasle才可以配置下面两个属性(有效)

timeToldleSeconds = “120”//对象最大空闲时间(秒)

timeToLiveSeconds = “240” //最大存活时间(秒)

(6)二级缓存在Hibernate框架中的配置:

	<!-- 告诉hibernate框架开启二级缓存 -->
	<property name="hibernate.cache.use_second_level_cache">true</property>
	<!-- 二级缓存提供的具体类 -->
	<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
	<!-- ehcache 二级缓存配置文件的位置 -->
	<property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>

① 告诉Hibernate框架要启动二级缓存;

② 告诉Hibernate框架,使用第三方哪个缓存的实现类;

③ 告诉Hibernate框架具体的ehache.xml配置文件具体的配置。


(7)告诉Hibernate框架,哪些类需要二级缓存(不经常变化的使用二级缓存)

	<!-- 需要使用二级缓存的对象(非严格读写) -->
	<class-cache usage="nonstrict-read-write" class="com.xupt.hibernate.entity.ProductEntity"/>
	<class-cache usage="nonstrict-read-write" class="com.xupt.hibernate.entity.TypeEntity"/>

(8)Hibernate框架中实体类对象使用的策略值可选:

  (9)使用Session查询的对象(调用get(),和load()方法)默认会被自动的放到一级缓存和二级缓存中,如果想控制一级缓存和二级缓存的交互行为,可如下设置:

 

//一级缓存中的对象不会被放入二级缓存中

session.setCacheMode(CacheMode.IGNORE);

其它可取的值如下:

CacheMode.IGNORE//不与二级缓存交互

CacheMode.NORMAL//可以与二级缓存交互

CacheMode.GET//仅从二级缓存读,而不向二级缓存写

CacheMode.PUT//仅从二级缓存写,而不从二级缓存读







猜你喜欢

转载自blog.csdn.net/super_yc/article/details/72599085