一、概述
一级、二级缓存都是对整个实体进行缓存,它不会缓存普通属性,如果想对普通属性进行缓存,则可以使用查询缓存。需要指出的是,在部分情况下查询缓存并不能提高应用属性,甚至反而会降低应用性能,只有经常使用相同的查询语句,并且使用相同的查询参数才能通过查询缓存获得好处,因此实际项目中请慎重使用查询缓存。查询缓存的生命周期直到属性被修改了为止。
查询缓存的key就是查询所用的hql或sql语句,语句和参数都相同时才能直接从查询缓存中得到数据。
二、使用查询缓存
1. 配置hibernate.cfg.xml
<!-- 启用查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
2. 测试
package test;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class TestPerson {
public static void main(String[] args) {
Configuration conf = new Configuration().configure();
SessionFactory sf = conf.buildSessionFactory();
// 创建第一个Session
Session sess = sf.openSession();
Transaction tx = sess.beginTransaction();
List list = sess.createQuery("from Person p").setCacheable(true).list();
for(Iterator pit = list.iterator(); pit.hasNext();){
Person p = (Person)pit.next();
System.out.println(p.getName() + "----1-----");
}
tx.commit();
// 创建第二个Session
Session sess2 = sf.getCurrentSession();
sess2.beginTransaction();
// 第二次查询,使用查询缓存
list = sess2.createQuery("from Person p").setCacheable(true).list();
for(Iterator pit = list.iterator(); pit.hasNext();){
Person p = (Person)pit.next();
System.out.println(p.getName() + "----2-----");
}
sess2.getTransaction().commit();
}
}