二级缓存

 
      Hibernate中提供了两级Cache:
        第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的 list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库
         第二级别的缓存是SessionFactory级别的缓存也称为进程级的缓存,它是属于进程范围或群集范围的缓存。二级缓存是全局缓存,它可以被所有的session共享。二级缓存的生命周期和SessionFactory的生命周期致,这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。 SessionFactory可以管理二级缓存。
          Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。
二级缓存的管理

  Hibernate的二级缓存策略的一般过程如下:  

1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。   

2) 把获得的所有数据对象根据ID放入到第二级缓存中。   

3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。  

4) 删除、更新、增加数据的时候,同时更新缓存。  

      Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于属性查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。

     在sessionfactory没有提供类似于clear方法,只提供了evict方法.

 一级缓存和二级缓存的交互。

     我们可以通过session设置当前的session以哪种方式来保存二级缓存。

CacheMode.NORMAL - 从二级缓存中读、写数据。

CacheMode.GET - 从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。

CacheMode.PUT - 仅向二级缓存写数据,但不从二级缓存中读数据。

   什么样的数据适合放在缓存中:

1.很少被修改的数据。

2.不是很重要的数据,允许出现偶尔并发的数据。

3.不会被并发访问的数据。

4.参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被很多其他的类的实例引用,实例极少或者从来不会修改。

不适合存放到第二级缓存的数据? 
1) 经常被修改的数据 
2) 财务数据,绝对不允许出现并发 
3) 与其他应用共享的数据。

二级缓存的类型

常用的缓存插件 Hibernater二级缓存是一个插件,下面是几种常用的缓存插件:
◆EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
◆OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。
◆SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。
◆JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。
 
二级缓存的配置

1.在src下创建ehcache.xml文件,其内容如下:

<ehcache>

     <diskStore path="java.io.tmpdir"/>

         <defaultCache

               maxElementsInMemory="10000"

               eternal="false"   

               overflowToDisk="true"

               timeToIdleSeconds="120"

               timeToLiveSeconds="120"

               diskPersistent="false" />

 </ehcache>

maxElementsInMemory用于指定缓存中最多可放多少个对象。

eternal属性指定缓存是否永久有效。

timeToIdleSeconds属性指定缓存多久未被使用便清理掉。

timeToLiveSeconds属性指定缓存的生命长度。

diskPersistent属性指定缓存是否被持久化到硬盘中,保存路径由<diskStore>标签指定

 

开启二级缓存

2.修改hibernate.cfg.xml文件。

<hibernate-configuration>

    <session-factory>

      <!-- 开启二级缓存 -->

     <property name="hibernate.cache.use_second_level_cache">true

       </property>

       <!-- 设置缓存提供者 -->

       <property name="hibernate.cache.provider_class">

           org.hibernate.cache.EhCacheProvider

       </property>

       <mapping resource="cn/ineeke/entity/User.hbm.xml"/>

     </session-factory>

 </hibernate-configuration>

指定实体类

3.指定哪些实体类使用缓存。经过第二步缓存是启用了,但是并没有被使用。它不会去自动把所有的实体都进行缓存了,而是需要手动指定哪个实体需要缓存,以及其缓存的策略。这里有两种方式:

       (一)修改要使用缓存的实体的映射文件。

       如在User.hbm.xml中使用<cache>标签启用。

                 

<hibernate-mapping>

           <class name="cn.ineeke.entity.User" table="t_user">

           <cache usage="read-only"/>

           <id name="id">

                 <generator class="native"/>

           </id>

           <property name="name"/>

          </class>

</hibernate-mapping>

指定实体

第二种方式是在hibernate.cfg.xml中使用<class-cache>标签指定实体类并启用

<hibernate-configuration>

       <session-factory>

            <!-- 开启二级缓存 -->

            <property  name="hibernate.cache.use_second_level_cache">

                   true

            </property>

            <!-- 设置缓存提供者 -->

            <property  name="hibernate.cache.provider_class">

                   org.hibernate.cache.EhCacheProvider

            </property>

            <mapping resource="cn/ineeke/entity/User.hbm.xml"/>

            <!-- 指定哪些实体需要使用二级缓存 -->

            <class-cache class="cn.ineeke.entity.User"  usage="read-only"/>

      </session-factory>                   

</hibernate-configuration>

缓存策略
 

      <class-cache>标签中的class属性指定要对哪个实体进行缓存,而usage属性与<cache>标签的相同,都指的是缓存策略,此值依实际需要而定,默认采用read-only。

缓存策略

   缓存有几种形式,可以在映射文件中配置:

read-only(只读,适用于很少变更的静态数据/历史数据)

nonstrict-read-write(不严格读写缓存,如果基本不会发生有两个事务同时修改一个数据的时候,比read-write的性能要好)

read-write(比较普遍的形式,效率一般)

transactional(JTA中,且支持的缓存产品较少)

你可能感兴趣的:(Hibernate,数据库,cache,session,Class,generator)