一级缓存
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语句,而是直接从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取,在不同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();
}