Hibernate查询缓存

本文详细解释了在Hibernate中配置查询缓存的方法,包括如何在hibernate.cfg.xml文件中启用查询缓存,以及如何在使用Query或Criteria时开启缓存。通过实例演示了如何利用查询缓存减少数据库查询,提升应用性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二级缓存中,如果不设置“查询缓存”,那么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);
//		}
		
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值