Hibernate的缓存机制

使用的前提条件:

1:固定不变的数据;

2:隔指定时间才去变动的数据;

3:一般情况下在查询的时候才使用

4:不会被并发访问的数据

  • 一级缓存

     Sessioon级别的缓存,非线程安全,每次使用完毕必须关闭。

     如果session关闭,一级缓存失效。

     默认一级缓存是开启的;

    Sql  在同一个session中,如果第二次执行的sql语句跟第一次执行的sql语句一致,不在去数据库重复查询;

@Test

 public void queryEmployee(){

  Session session = SessionUtils.getSession();

  Transaction trans = session.beginTransaction();

  trans.begin();

  System.out.println("第一次查询");

  session.createCriteria(Employee.class).list();

  System.out.println("第二次查询");

  session.load(Employee.class, 8);

  session.get(Employee.class, 7);

  trans.commit(); 

  session.close();

  Session session1 = SessionUtils.getSession();

  Transaction trans1 = session1.beginTransaction();

  trans1.begin();

  System.out.println("第三次查询");

  session1.get(Employee.class, 6);

  trans1.commit();

  session1.close();   

 }

  • 二级缓存

   A:基于sessionFactory的缓存。所有的session都共享;

   B:有插件去支持hibernate的二级缓存

         EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。

         OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。

         SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。

         JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。

步骤:

1.导包

*以下针对的是Hibernate3的配置

.Hibernate的包;

.hibernate-distribution-3.6.0.Final\lib\optional\ehcache下面的包

依赖jar包:

.commons-logging.jar

.backport-util-concurrent.jar


2.核心配置文件 hibernate.cfg.xml

二级缓存相关属性:

hibernate.cache.provider_class:该属性设置二级缓存CacheProvider类名

hibernate.cache.use_minimal_puts:以频繁的读操作为代价,优化二级缓存以实现最小化写的作。

hibernate.cache.use_query_cache:设置是否允许查询缓存。

hibernate.cache.use_second_level_cache:设置是否启用二级缓存;

hibernate.cache.query_cache_factory:设置查询缓存工厂的类名;

hibernate.cache.region_prefix:设置二级缓存区的名称的前缀

hibernate.cache.use_structured_entries:用于设置是否强制hunernate以更好的格式讲缓存存入二级缓存;

<!-- 配置二级缓存start -->

    <!-- 配置是否启用二级缓存 -->

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

    <!-- 使用hibernate缓存的插件类,告诉hibernate框架,使用的插件类是哪一个-->

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

  <!-- 配置二级缓存end -->

3.配置哪些数据使用二级缓存,不配置的话二级缓存不会缓存任何数据
(在hibernate.cfg.xml文件里和映射文件里配置2选1,需要注意的是
这些配置必须配置在映射文件的后面。
  • 在hibernate.cfg.xml文件里配置
         <!-- 引用映射文件 -->
         <mapping resource="com/jun/vo/employee.hbm.xml"/>
         <!-- 指定二级缓存应用到的实体对象 -->
         <class-cache usage="read-only" class="com.jun.vo.Employee"/>
  • 在映射文件中配置缓存(哪里使用缓存)

缓存策略:

     Read-only:只读,这个是最简单也是最常用的一种加载策略;

     Read/wirte:读写,可以读可以写;

天气预报:

  每天的7:59  11:59   16:59  通过spring 定时调度去查询天气预报的数据,并且放到缓存。


4.配置cache.xml

<?xml version="1.0" encoding="UTF-8"?>

<eache>

  <diskStore path="d:/log/cache"></diskStore>

  <defaultCache 

       maxElementsInMemory="500"

       eternal="false"

       timeToLiveSeconds="7200"

       timeToIdleSeconds="3600"

       overflowToDisk="true" />

       <!--

       name:

       maxElementsInMemory:设置缓存中可以放置多少个对象

       timeToIdleSeconds:设置对象在过去之前可以存活多少秒

       eternal:设置缓存是否永久有效

       overflowToDisk:设置缓存中的记录达到maxElementsInMemory就会被持久化到硬盘中,路径为diskStore

        -->
@Test
 public void secondCacheTest(){
  Session session = null;
  //开启第一个session
  try {
   session = SessionFactoryUtils.getSession();
   Transaction trans = session.beginTransaction();
   System.out.println("第一次查询");
   session.get(Employee.class, 2);
   //提交事务
   trans.commit();
  } catch (HibernateException e) {
   e.printStackTrace();
   //出错,事务回滚
   session.getTransaction().rollback();
  }finally{
   session.close();
  }
  //开启第二个session
  try {
   session = SessionFactoryUtils.getSession();
   Transaction trans = session.beginTransaction();
   System.out.println("第二次查询");
   session.get(Employee.class, 2);
   //提交事务
   trans.commit();
  } catch (HibernateException e) {
   e.printStackTrace();
   //出错,事务回滚
   session.getTransaction().rollback();
  }finally{
   session.close();
  }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值