(20)cache

需要引入jar包:ehcache-1.2.3jar
//类和(15)QL1中同
需要加ecache.xml文档

//一个session查询两次相同的内容,会发一次select语句--即支持一级缓存
    @Test
    public void testCache1() {
        Session session = sf.openSession();
        session.beginTransaction();
        Category c = (Category)session.load(Category.class, 1);
        System.out.println(c.getName());

        Category c2 = (Category)session.load(Category.class, 1);
        System.out.println(c2.getName());
        session.getTransaction().commit();
        session.close();

    }

    /*
     * 未开启二级缓存前,因为是两个session,所以会发两次select语句
     * 开启二级缓存后,只会发一次select语句
     * 二级缓存:就是在开启的每个session从属于一个大的session,当小session关闭后,大session中还存在该数据。
     * 每次load都是先从大session中找,是否有,若有不用select,若没有需要发select语句
     */
    @Test
    public void testCache2() {
        Session session = sf.openSession();
        session.beginTransaction();
        Category c = (Category)session.load(Category.class, 1);
        System.out.println(c.getName());


        session.getTransaction().commit();
        session.close();

        Session session2 = sf.openSession();
        session2.beginTransaction();
        Category c2 = (Category)session2.load(Category.class, 1);
        System.out.println(c2.getName());


        session2.getTransaction().commit();
        session2.close();
    }
    /*
     * load支持二级缓存,但是其后的select语句与load的对象很可能不同,所以查询不会从内存中找。
     */
    @Test
    public void testCache3() {
        Session session = sf.openSession();
        session.beginTransaction();
        Category c = (Category)session.load(Category.class, 1);
        System.out.println(c.getName());

        Query q=session.createQuery("from Category c where c.id=1 ");
        List<Category> categories=(List<Category>)q.list();
        for(Category c1:categories){
            System.out.println(c1.getName());
        }
        session.getTransaction().commit();
        session.close();

    }
    /*
     * load支持二级缓存,list向缓存中存放数据,所以当load时,会先看缓存,若有则不发select语句。
     */
    @Test
    public void testCache4() {
        Session session = sf.openSession();
        session.beginTransaction();

        Query q=session.createQuery("from Category c where c.id=1 ");
        List<Category> categories=(List<Category>)q.list();
        for(Category c1:categories){
            System.out.println(c1.getName());
        }

        Category c = (Category)session.load(Category.class, 1);
        System.out.println(c.getName());

        session.getTransaction().commit();
        session.close();

    }
    /*
     * 默认情况下:默认往二级缓存加数据,但是查询的时候不使用
     * 从上面的list后load,可以看出list是向缓存中放的。但是接着查询,无论是否是同一个对象,都是从新发select语句。
     * 原因:两次select很可能取不同的对象。
     * 所以在该例子中,会发两次select语句
     */

    @Test
    public void testCache5() {
        Session session = sf.openSession();
        session.beginTransaction();

        Query q=session.createQuery("from Category c where c.id=1 ");
        List<Category> categories=(List<Category>)q.list();
        for(Category c1:categories){
            System.out.println(c1.getName());
        }

        Query q1=session.createQuery("from Category c where c.id=1 ");
        List<Category> categories1=(List<Category>)q1.list();
        for(Category c1:categories1){
            System.out.println(c1.getName());
        }

        session.getTransaction().commit();
        session.close();

    }
    //如果要query用二级缓存,需打开查询缓存 <property name="cache.use_query_cache">true</property> 
    //query使用二级缓存是在两次查询语句相同的情况下。
    @Test
    public void testQueryCache() {
        Session session = sf.openSession();
        session.beginTransaction();
        List<Category> categories = (List<Category>)session.createQuery("from Category")
                                    .setCacheable(true).list();



        session.getTransaction().commit();
        session.close();

        Session session2 = sf.openSession();
        session2.beginTransaction();
        List<Category> categories2 = (List<Category>)session2.createQuery("from Category")
        .setCacheable(true).list();

        session2.getTransaction().commit();
        session2.close();
    }
    public static void main(String[] args) {
        beforeClass();
    }
 <property name="cache.use_second_level_cache">true</property>
        <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 
         <property name="cache.use_query_cache">true</property> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值