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

来源:互联网 发布:网络教育学籍参军 编辑:程序博客网 时间:2024/06/08 00:47

一级缓存

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();    }

这里写图片描述