Hibernate 缓存 学习笔记

一. 什么是缓存

      缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能. 
      Hibernate在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候就会从物理数据源中检索,所以,把频繁使用的数据加载到缓存区后,就可以大大减少应用程序对物理数据源的访问,使得程序的运行性能明显的提升.

 

二. Hibernate缓存分类

     1.Session缓存

         被称为一级缓存,它是hibernate的内置缓存,不能被卸载,并且每个session对应自己的缓存,不能跨越session进行该级别的缓存。  举例:在一个session中 , 使用get(***.class, id) 连续执行N次(id相同),只会执行一次数据库查询。但但跨session后, 则会被执行多次。

     2.SessionFactory缓存

        SessionFactory的缓存分为内置缓存和外置缓存,跨session级别.

         1).内置缓存 存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定义SQL语句等),对于应用程序来说,它是只读的.

         2).外置缓存 被称为二级缓存,存放的是数据库数据的副本。二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备.

     3. 无论是一级缓存, 还是二级缓存,都是只缓存实体对象的,只是二者的周期不同罢了。 支持一级缓存和二级缓存的方法有 get(), load(), iterate(查询实体对象),,其中 Query 和Criteria的list() 只会缓存,但不会使用缓存(除非结合查询缓存)。

     4.什么样的数据适合放在二级缓存中?

        1).很少被修改的数据;
        2).不是很重要的数据,允许出现偶尔并发的数据(重要数据:金融账户数据);
        3).不会被并发访问的数据;
        4).参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

    5.什么样的数据不适合放到二级缓存中?

        1).经常被修改的数据;
        2).财务数据,绝对不允许出现并发;
        3).与其他应用共享的数据。

    6.二级缓存策略的一般过程

        1):条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL句查询数据库,一次获得所有的数据对象(这个问题要考虑,如果你查询十万条数据时,内存不是被占用)。
        2):把获得的所有数据对象根据ID放入到第二级缓存中。
        3):当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
        4):删除、更新、增加数据的时候,同时更新缓存。
 

三. 二级缓存配置

      Hibernate二级缓存要通过插件来实现,Hibernate提供了org.hibernate.cache.CacheProvider借口,它充当缓存插件与Hibernate之间的适配器 . 常用的二级缓存插件 
    EHCache       org.hibernate.cache.EhCacheProvider
    OSCache       org.hibernate.cache.OSCacheProvider
    SwarmCahe  org.hibernate.cache.SwarmCacheProvider
    JBossCache   org.hibernate.cache.TreeCacheProvider

其中Ehcache的配置方法

1). 将echcache.xml文件拷贝到src下

2). 配置文件

hibernate.cfg.xml 方式

<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="hibernate.cache.use_second_level_cache">true</property> <!-- 开启二级缓存 -->

Spring

<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop> <!-- 开启二级缓存 -->

 

 

四.查询缓存

      查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id(其ID不是对象的真正ID,它与查询的条件相关即where后的条件相关,不同的查询条件,其缓存的id也不一样),查询缓存的生命周期,当前关联的表发生修改或是查询条件改变时,那么查询缓存生命周期结束,它不受一级缓存和二级缓存的生命周期的影响。但最好要配合二级缓存的使用。 开启查询缓存的方式

     1).cfg.xml

<property name="hibernate.cache.use_query_cache">true</property>

    2).spring

<prop key="hibernate.cache.use_query_cache">true</prop>   <!-- 开启查询缓存 -->

   在程序中,必须手动开启查询缓存, 如 query.setCacheable(true);
   其中 Query 的list() 就可利用到查询缓存了。

 

注意事项:

   1.使用缓存时, 要对Entity进行配置

 

    如若是注解方式 需配置 

@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)

    

    若是hbm.xml映射方式, 需配置("read-only" 缓存策略)

<cache usage="read-only"/> 

   

    也可在hibernate cfg.xml 文件中配置

<class-cache class="com.tcs.Classes" usage="read-only" />

  

  2.get和load都可以使用二级缓存, createSqlQuery执行的sql查询,无法使用查询缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值