一级缓存
- 一级缓存的数据结构是Map,用于存储查询 实体 。Map的key存放实体的Id,Map的value存放实体本身。所以一级缓存无法存储查询的属性。
- 一级缓存的生命周期与Session有关,Session产生一级缓存创建,Session关闭一级缓存销毁
- Get,Load,Iterator方法 读写 一级缓存,List方法 只写不读 一级缓存
- 一级缓存不能禁用,但可以通过Session的clear方法和evict方法清理一级缓存,从而达到禁止写缓存的效果
- Session的save方法会写缓存,在批量插入数据时要注意对一级缓存做定时清理。Hibernate的批量处理效率不高,建议使用Session.connection()或得Jdbc连接后使用Jdbc的相关API做批处理操作
二级缓存
- 二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享。
- 二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
- Hibernate 默认情况下是打开的,提供一个Hashtable存储二级缓存,但只适用于研发,开发中为第三方缓存组件提供了接入接口,我们可以根据不同情况选择不同的实现。
- 二级缓存也只能缓存实体对象,不缓存属性。
- ehcache二级缓存的配置和使用:
[list]
[*]将echcache.xml文件拷贝到src下
[*]开启二级缓存,修改hibernate.cfg.xml文件
[*]<property name="hibernate.cache.use_second_level_cache">true</property>
[*]指定缓存产品提供商,修改hibernate.cfg.xml文件
[*]<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
[*]指定那些实体类使用二级缓存(两种方法)
[*]在映射文件中采用<cache>标签
[*]在hibernate.cfg.xml文件中,采用<class-cache>标签
[/list]
<!-- 开启二级缓存 --><property name="hibernate.cache.use_second_level_cache">true</property>
<!-- 指定二级缓存的提供商 -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- 指定二级缓存适用的范围 -->
必须放在mapping下面
<class-cache class="com.pk.po.Person" usage="read-only"/>
顺序出错抛出异常
Exception in thread "main" org.hibernate.MappingException : invalid configuration
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:1487)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1428)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1414)
at com.zzu.util.ExportDB.main( ExportDB.java:10)
Caused by: org.xml.sax.SAXParseException: The content of element type "session-factory" must match "(property*,mapping*,(class-cache|collection-cache)*,event*,listener*)".
查询缓存
查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id
查询缓存的生命周期为当前关联的表发生修改,那么查询缓存生命周期结束
查询缓存的配置和使用:
- 在hibernate.cfg.xml文件中启用查询缓存,如:<property name="hibernate.cache.use_query_cache">true</property>
- 在程序中必须手动启用查询缓存,如:query.setCacheable(true);
List方法读写查询缓存,Iterator不读查询缓存