Hibernate——一级缓存__二级缓存__查询缓存

一级缓存

session级别缓存

@Test
    public void testCache() {
        testSaveGroup();

        Session session = sf.getCurrentSession();
        session.beginTransaction();

        Group g = (Group)session.get(Group.class, 1);
        System.out.println(g.getName());
        Group g2 = (Group)session.get(Group.class, 1);
        System.out.println(g2.getName());

        session.getTransaction().commit();

//      Session session2 = sf.getCurrentSession();
//      session2.beginTransaction();
//      Group g2 = (Group)session2.get(Group.class, 1);
//      System.out.println(g2.getName());
//      session2.getTransaction().commit();

    }

一级缓存1
在同一个session中第二次调用同一个对象时不会再发出sql语句,而是直接从session缓存中找

@Test
    public void testCache() {
        testSaveGroup();

        Session session = sf.getCurrentSession();
        session.beginTransaction();

        Group g = (Group)session.get(Group.class, 1);
        System.out.println(g.getName());
//      Group g2 = (Group)session.get(Group.class, 1);
//      System.out.println(g2.getName());

        session.getTransaction().commit();

        Session session2 = sf.getCurrentSession();
        session2.beginTransaction();
        Group g2 = (Group)session2.get(Group.class, 1);
        System.out.println(g2.getName());
        session2.getTransaction().commit();

    }

一级缓存2
一级缓存无法跨session取,在不同session中取同一个对象发出了两次sql

二级缓存

sessionFactory级别缓存,可以跨session存在。
在内存中开辟一块公共的空间,所有的session都可以从中存取数据。
这里写图片描述

@Test
    public void testCache() {
        testSaveGroup();

        Session session = sf.getCurrentSession();
        session.beginTransaction();

        Group g = (Group)session.get(Group.class, 1);
        System.out.println(g.getName());
//      Group g2 = (Group)session.get(Group.class, 1);
//      System.out.println(g2.getName());

        session.getTransaction().commit();

        Session session2 = sf.getCurrentSession();
        session2.beginTransaction();
        Group g2 = (Group)session2.get(Group.class, 1);
        System.out.println(g2.getName());
        session2.getTransaction().commit();

    }

这里写图片描述
跨session也只发了一次sql语句

二级缓存适用条件
1.经常被访问
2.不经常改动
3.数量有限

load默认使用二级缓存
iterate默认使用二级缓存
list默认往二级缓存加数据,但查询时不用二级缓存

查询缓存(三级缓存)

配置文件中添加

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

二级缓存中的一种特殊缓存
list查询时是直接从数据库找的,设置了查询缓存后,如果是同样的重复的查询,就可以从二级缓存中找。

不使用查询缓存

@Test
    public void testCache2() {
        testSaveGroup();

        Session session = sf.getCurrentSession();
        session.beginTransaction();
        List<User> users = session.createQuery("from User").list();
        List<User> users2 = session.createQuery("from User").list();
        session.getTransaction().commit();


    }

这里写图片描述

使用查询缓存

@Test
    public void testCache2() {
        testSaveGroup();

        Session session = sf.getCurrentSession();
        session.beginTransaction();
        List<User> users = session.createQuery("from User").setCacheable(true).list();
        List<User> users2 = session.createQuery("from User").setCacheable(true).list();
        session.getTransaction().commit();

    }

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值