二级缓存中,如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用 findall()、list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置 hibernate.cache.use_query_cache true ,即配置查询缓存
如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性
hibernate查询缓存
配置:
在hibernate.cfg.xml文件中加入:<property name="hibernate.cache.use_query_cache">true</property>
1、针对普通属性结果集的缓存
2、对是实体对象的结果集,只缓存id
3、使用查询缓存,需要打开查询缓存,并且在调用list方法之前需要显示的调用query.setCacheable(true);
4、查询缓存与session无关,即在一个session上做了查询缓存,那么在另一个session中可以取到查询缓存的内容,不再发出SQL
5、查询缓存只对query.list()操作有效,query.iterate()操作不会使用查询缓存
6、要注意区别:一级缓存与二级缓存是缓存实体,而查询缓存是缓存普通属性。
配置数据等与二级缓存一样,只是在hibernate.cfg.xml中加入
<property name="hibernate.cache.use_query_cache">true</property>
用来配置查询缓存。
测试类:
package com.bjsxt.hibernate;
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import org.hibernate.CacheMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import junit.framework.TestCase;
public class QueryCacheTest extends TestCase {
/**
* 执行两次query
*
*/
public void testCache1() {
Session session = null;
try {
session = HibernateUtils.getSession();
Query query = session.createQuery("select s.name from Student s");
query.setCacheable(true);
List names = query.list();
for (Iterator iter = names.iterator(); iter.hasNext();) {
String name = (String)iter.next();
System.out.println(name);
}
System.out.println("----------------------------------------------------");
//不再发出sql,因为启用了查询缓存
query = session.createQuery("select s.name from Student s");
query.setCacheable(true);
names = query.list();
for (Iterator iter = names.iterator(); iter.hasNext();) {
String name = (String)iter.next();
System.out.println(name);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 执行两次query,第二个query新open一个session
*
*/
public void testCache2() {
Session session = null;
try {
session = HibernateUtils.getSession();
Query query = session.createQuery("select s.name from Student s");
query.setCacheable(true);
List names = query.list();
for (Iterator iter = names.iterator(); iter.hasNext();) {
String name = (String)iter.next();
System.out.println(name);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
try {
session = HibernateUtils.getSession();
System.out.println("----------------------------------------------------");
//不再发出sql,因为查询缓存的生命周期和session无关
Query query = session.createQuery("select s.name from Student s");
query.setCacheable(true);
List names = query.list();
for (Iterator iter = names.iterator(); iter.hasNext();) {
String name = (String)iter.next();
System.out.println(name);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 采用query.iterate测试
*
*/
public void testCache3() {
Session session = null;
try {
session = HibernateUtils.getSession();
Query query = session.createQuery("select s.name from Student s");
query.setCacheable(true);
Iterator iter = query.iterate();
while (iter.hasNext()) {
String name = (String)iter.next();
System.out.println(name);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
try {
System.out.println("----------------------------------------------------------");
session = HibernateUtils.getSession();
Query query = session.createQuery("select s.name from Student s");
query.setCacheable(true);
//query.iterate()操作不会使用查询缓存
//!!!查询缓存只对query.list()操作有效!
Iterator iter = query.iterate();
while (iter.hasNext()) {
String name = (String)iter.next();
System.out.println(name);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
}
/**
* 1、使用查询缓存
* 2、查询实体对象数据
* 3、把二级缓存关闭
*
*/
public void testCache4() {
Session session = null;
try {
session = HibernateUtils.getSession();
Query query = session.createQuery("select s from Student s");
query.setCacheable(true);
List students = query.list();
for (Iterator iter = students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}
System.out.println("-------------------------------------------------");
query = session.createQuery("select s from Student s");
query.setCacheable(true);
students = query.list();
for (Iterator iter = students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtils.closeSession(session);
}
// try {
// System.out.println("-------------------------------------------------");
// session = HibernateUtils.getSession();
// //将会发出n条查询语句,因为二级缓存被关闭,而查询缓存中的数据只是实体对象的id
// //list操作会根据这些id依次到数据库中查找
// Query query = session.createQuery("select s from Student s");
// query.setCacheable(true);
// List students = query.list();
// for (Iterator iter = students.iterator(); iter.hasNext();) {
// Student student = (Student)iter.next();
// System.out.println(student.getName());
// }
// }catch(Exception e) {
// e.printStackTrace();
// }finally {
// HibernateUtils.closeSession(session);
// }
}
}