需要引入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>