Hibernate缓存

需要引入的jar包:hibernate-release-4.3.10.Final\lib\optional\ehcache\*

一级缓存

     一级缓存也叫session级的缓存或事务级缓存,一级缓存生命周期和session的生命周期一致。一级缓存是缓存实体对象的,load/get/iterate查询实体对象支持一级缓存。所以iterate查询普通属性时,一级缓存就不会缓存。
     session间是不会共享一级缓存的。
     save也支持缓存。
     session.flush()会清除缓存中的内容。

二级缓存

    二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享。二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
    二级缓存的配置和使用:
1.ehcache.xml
<diskStore path="java.io.tmpdir"/>
<defaultCache
        maxElementsInMemory="10000"
        eternal="false" //是否过期,true为永远不过期
        timeToIdleSeconds="120"//对象间隔多长没被访问就清除
        timeToLiveSeconds="120"//存活时间
        overflowToDisk="true"//如果超出10000个对象,即溢出,设置为true表示保存在磁盘上,路径为diskStore
        />
    也可以进行单独配置,对Student单独采用以下策略
    <cache name="com.hibernate.Student"
        maxElementsInMemory="100"
        eternal="false"
        timeToIdleSeconds="10000"
        timeToLiveSeconds="10000"
        overflowToDisk="true"
        />
      2.在hibernate.cfg.xml文件中配置二级缓存
<!-- 配置二级缓存 -->  
<property name="hibernate.cache.use_second_level_cache">true</property>  
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>  
      3.指定哪些实体类使用二级缓存
    可以在映射文件中采用<cache>标签下加<cache usage="read-only"/>标签。
         read-only表示缓存一个持久化类的实例,而不允许对其修改。这是最简单,也是实用性最好的方法。
         read-write可以更新数据。

    或在hibernate.cfg.xml文件中指定
      <!--指定Student使用二级缓存-->
      <class-cache class="com.bjpowernode.hibernate.Student" usage="read-only"/>

      缓存原则:通常读远远大于写的数据进行缓存
//清除二级缓存中内容
        SessionFactory().evict(Student.class);//清除所有Student实体
        SessionFactory().evict(Student.class, 1);//清除具体的Student实体

        二级缓存主要是缓存实体对象的。默认情况下,一级缓存会把数据放在二级缓存中。session可以直接用二级缓存。
        一级缓存和二级缓存的交互:
               //禁止将一级缓存中的数据放到二级缓存中
               session.setCacheMode(CacheMode.IGNORE);
        大批量数据更新时,如果配置了二级缓存,建议禁用一级缓存和二级缓存的交互。

查询缓存

    查询缓存是缓存普通属性结果集的,实体对象的结果集会缓存id。
    查询缓存的生命周期,当关联的表发生修改,查询缓存的生命周期结束,与session无关。

    查询缓存的配置和使用:
       1.修改hibernate.cfg.xml文件,开启查询缓存,默认是false。
           <property name="hibernate.cache.use_query_cache">true</property>  
       2.在程序启用。
     query.setCacheable(true)

    query.iterate()在查询普通属性不会使用查询缓存,查询缓存只对query.list()起作用。
    查询实体对象时,查询缓存只会缓存的id,再次执行query.list(),将查询缓存中的id依次取出,分别到一级缓存和二级缓存中查询相应的实体对象,如果存在就使用缓存中的实体对象,否则根据id发出查询语句。

你可能感兴趣的:(Hibernate缓存)