Hibernate 笔记 缓存

1 Hibernate 缓存

缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库和访问层之间。ORM在进行数据读取时,会根据缓存管理策略,首先在缓冲中查询,如果发现,则直接使用,避免数据库调用的开销。

   数据缓存的策略:
  •事务级缓存:当前事务范围内的数据缓存
  •应用级缓存:某个应用中的数据缓存
  •分布式缓存:多个应用,多个JVM之间共享缓存。分布式缓存由多个应用级缓存实例组成集群,通过某种远程机制实现各个缓存实例之间的数据同步,任何一个实例的                             数据修改后,将导致整个集群间的数据状态同步。
 
2 一级缓存
 
  • 一级缓存的数据结构是Map,用于存储查询实体。Map的key存放实体的Id,Map的value存放实体本身。所以一级缓存无法存储查询的属性。
  • 一级缓存的生命周期与Session有关,Session产生一级缓存创建,Session关闭一级缓存销毁
  • Get,Load,Iterator方法读写一级缓存,List方法只写不读一级缓存

                  load(get)查询数据步骤:

                                                        1查询一级缓存

 

                                        2 一级缓存没有数据,发送SQL,有数据返回数据

 

                                        3 写入一级缓存

 

                                       

 

 

                 Iterator查询数据步骤:

                             1  发送查询id的sql

                             2  根据id查询缓存

                             3  如果缓存中有数据,直接取出,如果没有去数据库中查询,并写入一级缓存

  • 一级缓存不能禁用,但可以通过Session的clear方法和evict方法清理一级缓存,从而达到禁止写缓存的效果
  • Session的save方法会写缓存,在批量插入数据时要注意对一级缓存做定时清理。Hibernate的批量处理效率不高,建议使用Session.connection()或得Jdbc连接后使用Jdbc的相关API做批处理操作
 
3 二级缓存
 
          二级缓存属于应用级缓存,集群性缓存 
  定义步骤: 
1、打开缓存,在hibernate.cfg.xm中加入: 
<property name="hibernate.cache.use_second_level_cache">true</property> 

2、指定缓存策略提供商,在hibernate.cfg.xm中加入: 
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 

3、拷贝echcahe.xml到src下,可以针对不同的策略配置缓存 

4、指定那些类使用缓存(两种方式) 
   <class-cache class="com.gzl.po.Dept usage="read-only"/> 
  * 在hibernate.cfg.xml   
  * 在映射文件中 
  • 二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享。
  • 二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
  • Hibernate 默认情况下是打开的,提供一个Hashtable存储二级缓存,但只适用于研发,开发中为第三方缓存组件提供了接入接口,我们可以根据不同情况选择不同的实现。
  • 二级缓存也只能缓存实体对象,不缓存属性。
  • Get,Load,Iterator方法读写二级缓存,List方法只写不读二级缓存

                  load(get)查询数据步骤:

                                                        1查询一级缓存 如果没有数据,查询二级缓存

                                        2 二级缓存也没有数据 去数据库查找,如果有会拷贝到一级缓存

                                        3 写入一级缓存

                                        4 拷贝到二级缓存

  • 设置<property name=“hibernate.cache.use_second_level_cache”>fasle</property>可以禁用二级缓存。
  • 在一次Session交互中,可以设置Session的CacheMode为Put来禁用读操作,设置CacheMode为Get来禁用写操作
  • 也可以通过SessionFacotry的evict方法清理二级缓存来达到禁止写二级缓存的效果
 
4 查询缓存
 
  • 查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id
  • 查询缓存的生命周期为当前关联的表发生修改,那么查询缓存生命周期结束
  • 查询缓存的配置和使用:

        * 在hibernate.cfg.xml文件中启用查询缓存,如:

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

        * 在程序中必须手动启用查询缓存,如:

        query.setCacheable(true);

  • List方法读写查询缓存,Iterator不读查询缓存
  • 二级缓存和查询缓存搭配使用效果最佳
 
 
posted @ 2011-11-07 16:19  蓝冰竹斋  阅读(826)  评论(0编辑  收藏  举报