`

查询缓存

阅读更多
查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id

查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束
查询缓存的配置和使用:
* 在hibernate.cfg.xml文件中启用查询缓存,如:
<property name="hibernate.cache.use_query_cache">true</property>
* 在程序中必须手动启用查询缓存,如:
query.setCacheable(true);
         查询缓存的生命周期和session无关
          查询缓存只对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查询缓存

public class CacheLevel2Test extends TestCase {

	/**
	 * 开启查询缓存,关闭二级缓存
	 * 
	 * 开启一个session,分别调用query.list
	 */
	public void testCache1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			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("-------------------------------------");
			query = session.createQuery("select s.name from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			//没有发出查询sql,因为启用了查询缓存
			names = query.list(); 
			for (Iterator iter=names.iterator();iter.hasNext(); ) {
				String name = (String)iter.next();
				System.out.println(name);
			}

			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	/**
	 * 开启查询缓存,关闭二级缓存
	 * 
	 * 开启两个session,分别调用query.list
	 */
	public void testCache2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			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);
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		System.out.println("-------------------------------------");
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s.name from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			//不会发出查询sql,因为查询缓存的生命周期和session无关
			List names = query.list(); 
			for (Iterator iter=names.iterator();iter.hasNext(); ) {
				String name = (String)iter.next();
				System.out.println(name);
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
	
	/**
	 * 开启查询缓存,关闭二级缓存
	 * 
	 * 开启两个session,分别调用query.iterate
	 */
	public void testCache3() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s.name from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			 
			for (Iterator iter=query.iterate();iter.hasNext(); ) {
				String name = (String)iter.next();
				System.out.println(name);
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		System.out.println("-------------------------------------");
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s.name from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			 
			//查询缓存只对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用
			//查询缓存
			for (Iterator iter=query.iterate();iter.hasNext(); ) {
				String name = (String)iter.next();
				System.out.println(name);
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}
	
	/**
	 * 关闭查询缓存,关闭二级缓存
	 * 
	 * 开启两个session,分别调用query.list查询实体对象
	 */
	public void testCache4() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			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());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		System.out.println("-------------------------------------");
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s from Student s");
			//启用查询查询缓存
			//query.setCacheable(true);
			//会发出查询sql,因为list默认每次都会发出查询sql
			List students = query.list(); 
			for (Iterator iter=students.iterator();iter.hasNext(); ) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		

	/**
	 * 开启查询缓存,关闭二级缓存
	 * 
	 * 开启两个session,分别调用query.list查询实体对象
	 */
	public void testCache5() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			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());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		System.out.println("-------------------------------------");
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			//会发出n条查询语句,因为开启了查询缓存,关闭了二级缓存,那么查询缓存会缓存实体对象的id
			//所以hibernate会根据实体对象的id去查询相应的实体,如果缓存中不存在相应的
			//实体那么将发出根据实体id查询的sql语句,否则不会发出sql使用缓存中的数据
			List students = query.list(); 
			for (Iterator iter=students.iterator();iter.hasNext(); ) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	/**
	 * 开启查询缓存,开启二级缓存
	 * 
	 * 开启两个session,分别调用query.list查询实体对象
	 */
	public void testCache6() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			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());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		System.out.println("-------------------------------------");
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Query query = session.createQuery("select s from Student s");
			//启用查询查询缓存
			query.setCacheable(true);
			
			//不会发出查询sql,因为开启了二级缓存和查询缓存,查询缓存缓存了实体对象的id列表
			//hibernate会根据实体对象的id列表到二级缓存中取得相应的数据
			List students = query.list(); 
			for (Iterator iter=students.iterator();iter.hasNext(); ) {
				Student student = (Student)iter.next();
				System.out.println(student.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
}
分享到:
评论

相关推荐

    Hibernate一级缓存、二级缓存以及查询缓存实例

    本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...

    hibernate一级缓存、二级缓存和查询缓存

    **hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...

    PHP查询缓存.doc

    【PHP查询缓存】是指在PHP应用程序中,为了提高数据库查询效率和减轻数据库负载,将SQL查询的结果存储起来,下次相同查询时直接读取缓存数据,而不是重新执行查询。这种方式特别适用于那些频繁且静态的数据,可以...

    spring AOP实现查询缓存

    本代码通过使用spring aop+ehcache的技术,实现了方法级别的查询缓存,主要原理是 方法的完整路径+方法参数值,作为key,放入cache中,下次访问时先判断cache中是否有该key.

    hibernate开启二级缓存和查询缓存

    在 Hibernate 中,二级缓存和查询缓存是提高应用性能的重要机制。下面将详细介绍如何开启并理解这两个缓存机制。 ### 1. 一级缓存与二级缓存 #### 1.1 一级缓存 一级缓存是 Hibernate 内置的 Session 缓存,它是每...

    释放查询潜力:深度配置MySQL查询缓存

    ### 释放查询潜力:深度配置 MySQL 查询缓存 #### MySQL 概览 MySQL 是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于 Web 应用程序的后端数据存储。它基于结构化查询语言(SQL)进行数据管理,是 LAMP...

    hibernate查询缓存1

    在深入探讨Hibernate查询缓存之前,我们先了解一下Hibernate的基础概念。Hibernate是一个强大的Java持久化框架,它简化了数据库操作,提供了对象关系映射(ORM)功能。在Hibernate中,对象的状态分为瞬时态、持久态...

    Hibernate查询缓存及实现.PPT

    【标题】:“Hibernate查询缓存及实现.PPT” 【描述】:“Hibernate查询缓存及实现.PPT” 在本文中,我们将深入探讨Hibernate框架中的查询缓存机制及其实施步骤,这是一项旨在提高应用程序性能的重要功能。查询...

    MySQL 执行过程与查询缓存1

    MySQL 执行过程与查询缓存是数据库操作中的关键环节,理解这一过程对于优化数据库性能至关重要。MySQL 的执行流程包括以下几个步骤: 1. **客户端发送查询**:当用户通过MySQL客户端发送一条SQL查询时,这个请求会...

    day37 07-Hibernate二级缓存:查询缓存

    今天我们要探讨的是Hibernate的二级缓存,特别是查询缓存这一重要特性。 首先,我们需要理解缓存的概念。缓存是一种存储技术,用于临时存放经常访问的数据,以减少对主存储器(如数据库)的访问,从而提高系统性能...

    论文研究-自适应的数据库查询缓存.pdf

    而查询缓存是语义缓存的一种,在 SQL解析与查询执行之间,通过研究查询缓存的自主管理来提高数据库的查询性能。首先介绍了数据库常用的语义缓存与自主计算,然后对查询缓存进行了形式化定义,并提出了自适应的查询...

    Freyja的查询缓存功能详解

    Freyja是一个专为提升查询效率而设计的开源工具,其核心特性就是强大的查询缓存功能。这篇博客将深入解析Freyja如何通过缓存机制来优化数据库操作,帮助开发者提高应用性能。 首先,我们要理解查询缓存的基本概念。...

    如何对查询缓存进行维护和调优[文].pdf

    查询缓存是MySQL数据库系统中的一个重要特性,用于提高查询性能,通过存储已执行过的SQL查询结果,以便后续相同的查询可以直接从缓存中获取结果,而不是重新执行查询。维护和调优查询缓存对于优化数据库性能至关重要...

    MYSQL查询缓存性能问题分析与优化案例(绝对精华)[参照].pdf

    在MySQL数据库系统中,查询缓存(Query Cache)是一个旨在提高性能的重要特性,它通过存储已执行查询的结果集来避免对相同查询的重复解析、优化和执行过程。然而,如同【标题】和【描述】中提到的情况,不当配置的...

    Redis从入门到精通(四)Redis实战(二)商户查询缓存 测试项目代码

    本教程将基于“Redis从入门到精通(四)Redis实战(二)商户查询缓存”的主题,深入探讨如何利用Redis来实现商户查询的高效缓存策略。我们将通过测试项目代码来理解这一过程。 首先,让我们理解Redis缓存的基本概念。...

Global site tag (gtag.js) - Google Analytics