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

时间:2021-11-22 00:49:07

一级缓存

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

}

Hibernate——一级缓存__二级缓存__查询缓存
在同一个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();

}

Hibernate——一级缓存__二级缓存__查询缓存
一级缓存无法跨session取,在不同session中取同一个对象发出了两次sql

二级缓存

sessionFactory级别缓存,可以跨session存在。
在内存中开辟一块公共的空间,所有的session都可以从中存取数据。
Hibernate——一级缓存__二级缓存__查询缓存

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

}

Hibernate——一级缓存__二级缓存__查询缓存
跨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();


}

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

使用查询缓存

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

}

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