Hibernate学习记录4 缓存机制

来源:互联网 发布:怎么把淘宝放到桌面 编辑:程序博客网 时间:2024/05/21 06:11

Hibernate缓存有两级:

一级缓存 session级别的缓存

概念

它属于事务范围的缓存。它只存在于Session的生命周期。程序调用save(),update(),saveorupdate()等方法及调用查询接口 list,filter,iterate时,如果session缓存没有相应的对像,就会自动加入到一级缓存里。
session关闭时,其管理的一级缓存也会被清除。
一级缓存不能进行配置,不能卸载。
一级缓存的内部结果就是map

方法

  • session.evict() : 将某个对象从Session的一级缓存中清除
  • session.clear(): 将一级缓存中的所有对象清除

二级缓存 SessionFactory级别的缓存

这一级别的缓存可以配置和更改,动态的加载和卸载,属于进程级缓存,可以让所有的session共享。
二级缓存的生命周期与SessionFactory一致,由SessionFactory管理二级缓存。
二级缓存是HashTable结构,只能保持实体对象,不能保存属性。

二级缓存默认是打开的。设置的方式是:

hibernate.cache.use_query_cache=true

或者在hibernate.cfg.xml设置

配置方式:

hibernate.cfg.xml

<!-- 指明二级缓存的提供商 --><property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property><!-- 是否开启二级缓存,true开启二级缓存,false关闭二级缓存 --><property name="cache.use_second_level_cache">true</property><!-- 指定把那个对象放入二级缓存当中 --><class-cache class="com.tarena.po.Student" usage="read-only"/>

ehcache.xml

//在该二级缓存中,最多可以缓存对象的数量maxElementsInMemory="1000" //缓存在二级缓存中的对象是否永远都有效,一般配置为falseeternal="true"//"钝化":两次访问该二级缓存中对象的,间隔时间timeToIdleSeconds="120"//二级缓存中的对象从创建到消亡的时间  timeToLiveSeconds="120"//如果超过缓存的访问,可以写入到硬盘上的overflowToDisk="true"

二级缓存的管理

使用SessionFactory来管理我们的二级缓存首先修改HibernateUtil,添加获得SessionFactory的方法SessionFactory factory = HibernateUtil2.getSessionFactory();factory.evict(Student.class,1);//去掉二级缓存中id为1的student对象factory.evict(Student.class);//去掉二级缓存中所有的student对象

缓存读取流程

Hibernate将第一次读取的内容放到缓存
如果数据库被其它程序修改,Hibernate这时读取的数据仍是缓存数据。(先从一级缓存读,如果没有则从二级缓存读)。

查询缓存

另外Hibernate为查询结果提供了一个查询缓存,依赖于第二级缓存。
查询用来保存属性的,对实体结果集只保存id
查询缓存的生命周期,只有当前表发生改变,查询缓存的生命周期结束

使用查询缓存

修改hibernate.cfg.xml文件,开启查询缓存<!-- 是否开启查询缓存,true开启查询缓存,false关闭查询缓存 --><property name="cache.use_query_cache">true</property>

在Query对象中必须手动开启查询缓存

createSQLQuery创建的SQLQuery对象query中设置query.setCacheMode(CacheMode.IGNORE);读取数据时,不和二级缓存交换数据,直接读取数据库
0 0