Hibrenate 查询缓存

查询缓存

 为数据缓存,不需要缓存一张表中的所有的字段,只需要一部分字段

这里写图片描述

这里写图片描述

UpdateTimeStampsCache记录了查询缓存中数据随着时间的变化,hibernate内部就是通过时间戳的方式来检查查询缓存中的数据是否发生变化,发生变化,说明缓存的内容已经和数据库中的不一样了,那么就从缓存中清除已经变化的内容

public class QueryCacheTest  extends HibernateUtil{
    @Test
    public  void  QueryCacheTest(){
        Session session=sessionFactory.openSession();
        Query query=session.createQuery("select  name from  com.sanmao.onemanyutils.Classes");
         query.setCacheable(true);//可以访问查询缓存
        query.list();
        session.close();

        session=sessionFactory.openSession();
        query=session.createQuery("select  name from  com.sanmao.onemanyutils.Classes");
        query.setCacheable(true);//可以访问查询缓存
        query.list();
        //第二次讲不会发出sql 语句,因为从查询缓存中直接获取
        session.close();
    }

    /**
     *  只要hql 有一丁点儿,不一样那么查询缓存就识别不了
     * */
    @Test
    public  void  QueryCacheTest2(){
        Session session=sessionFactory.openSession();
        Query query=session.createQuery("select  name from  com.sanmao.onemanyutils.Classes");
        query.setCacheable(true);//可以访问查询缓存
        query.list();
        session.close();

        session=sessionFactory.openSession();
        query=session.createQuery("select  name from  com.sanmao.onemanyutils.Classes where cid=:cid");
       query.setParameter("cid",1L);
        query.setCacheable(true);//可以访问查询缓存
        query.list();
        //因为hql 语句不一样,所以 不会从查询缓存中获取,而是 产生新的SQL语句
        session.close();
    }

    /**
     * 先把数据放入到查询缓存中,把查询缓存中的数据进行修改,再次查询
     */
    @Test
    public void testQueryDataFromQueryCache(){
        Session session  = sessionFactory.openSession();
        Query query = session.createQuery("select name from Classes");
        query.setCacheable(true);//可以访问查询缓存
        query.list();//classes表中的name字段的数据就被放入到了查询缓存中
        session.close();

        session  = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        Classes classes = (Classes)session.get(Classes.class, 1L);
        classes.setName("tyty");
        transaction.commit();//把数据修改了,hibernate就会检测到一级缓存中的数据被修改了,
        // 说明查询缓存中的数据过时了
        //所以查询缓存中的数据就被清空了
        session.close();

        session  = sessionFactory.openSession();
        query = session.createQuery("select name from Classes");
        query.setCacheable(true);//可以访问查询缓存
        query.list();//查询缓存中没有数据了,所以还要发出sql语句
        session.close();
    }
    /**
     * 把一个属性放入到二级缓存中
     */
    @Test
    public void testSecondCache(){
        Session session  = sessionFactory.openSession();
        Query query = session.createQuery("select name from Classes");
        query.list();//query.list方法产生的结构不符合二级缓存中的要求
        System.out.println(sessionFactory.getStatistics().getEntityLoadCount());
        session.close();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值