Hibernate缓存

来源:互联网 发布:如何搭建数据库 编辑:程序博客网 时间:2024/06/08 07:50

一.hibernate有一级缓存,二级缓存,和查询缓存。其中一二级缓存都是用来缓存对象,查询缓存是用来缓存属性。

一级

1.一级缓存的数据结构是Map,用于存储查询实体。Map的key存放实体的Id,Map的value存放实体本身。所以一级缓存无法存储查询的属性。
2.一级缓存的生命周期与Session有关,Session产生一级缓存创建,Session关闭一级缓存销毁
3.Get,Load,Iterator方法读写一级缓存,List方法只写不读一级缓存
4.一级缓存不能禁用,但可以通过Session的clear方法(清除所有)和evict方法(指定类清除)清理一级缓存,从而达到禁止写缓存的效果
5.Session的save方法会写(一级)缓存,在批量插入数据时要注意对一级缓存做定时清理。Hibernate的批量处理效率不高,建议使用Session.connection()或得Jdbc连接后使用Jdbc的相关API做批处理操作
二级

1.二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享。
2.二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。
3.Hibernate默认情况下是打开的,提供一个Hashtable存储二级缓存,但只适用于研发,开发中为第三方缓存组件提供了接入接口,我们可以根据不同情况选择不同的实现。
4.二级缓存也只能缓存实体对象,不缓存属性。
5.可以通过session.setCacheMode()  CacheMode.PUTCacheMode.GETCacheMode.NORMAL来设置二级缓存
6.ehcache二级缓存的配置和使用:

  * 将echcache.xml文件拷贝到src下

  * 开启二级缓存,修改hibernate.cfg.xml文件

  <propertyname="hibernate.cache.use_second_level_cache">true</property>

  * 指定缓存产品提供商,修改hibernate.cfg.xml文件

  <propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

  * 指定那些实体类使用二级缓存(两种方法)

  * 在映射文件中采用<cache>标签

  * 在hibernate.cfg.xml文件中,采用<class-cache>标签

如:

<hibernate-configuration><session-factory><property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.username">scott</property> <property name="hibernate.connection.password">tiger</property> <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property><property name="format_sql">true</property><property name="show_sql">true</property><property name="hibernate.cache.use_second_level_cache">true</property><property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property><mapping resource="com/pk/po/Person.hbm.xml"/><class-cache usage="read-only" class="com.pk.po.Person"/></session-factory><!--<session-factory><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernateCache</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">mysql</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="format_sql">true</property><property name="show_sql">true</property><property name="hibernate.cache.use_second_level_cache">true</property><property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property><mapping resource="com/pk/po/Person.hbm.xml"/><class-cache usage="read-only" class="com.pk.po.Person"/></session-factory> --></hibernate-configuration>

注意:save在注释的那部分配置信息中是无效的,也就是对二级缓存无效,但可以再oracle中有效

查询缓存

1.查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id
2.查询缓存的生命周期为当前关联的表发生修改,那么查询缓存生命周期结束
3.查询缓存的配置和使用:

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

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

  * 指定缓存产品提供商,修改hibernate.cfg.xml文件

  <propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

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

  query.setCacheable(true);

4.List方法读写查询缓存,Iterator不使用查询缓存

复制搜索
原创粉丝点击