- 浏览: 84222 次
- 性别:
- 来自: 上海
文章分类
最新评论
查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id
查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束
查询缓存的配置和使用:
* 在hibernate.cfg.xml文件中启用查询缓存,如:
<property name="hibernate.cache.use_query_cache">true</property>
* 在程序中必须手动启用查询缓存,如:
query.setCacheable(true);
查询缓存的生命周期和session无关
查询缓存只对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查询缓存
查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束
查询缓存的配置和使用:
* 在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); } } }
发表评论
-
Fetch抓取策略
2008-12-21 15:30 10591 hibernate抓取策略(单端代理的批量抓取) 保持默 ... -
二级缓存
2008-12-21 09:55 837二级缓存也称进程级的缓存或SessionFactory级的缓存 ... -
一级缓存
2008-12-20 21:18 846一级缓存很短和session的生命周期一致,一级缓存也叫ses ... -
HQL 原生SQL查询 外置命名查询 查询过滤器 DML风格的查询
2008-12-20 15:04 1294在hql中关键字不区分大小写,但是属性和类名区分大小写 1、简 ... -
冬夜读书示子律
2008-12-19 16:11 814古人学问无遗力,少壮功夫老始成。 纸上得来终觉浅,绝知此事要躬 ... -
悲观锁与乐观锁
2008-12-19 15:49 759悲观锁 悲观锁的实现,通常依赖于数据库机制,在整个过程中将数据 ... -
Set Map Arrary List 集合映射
2008-12-19 14:50 860<class name="com.bjsxt. ... -
composite 映射
2008-12-19 10:48 782通常将复合主键相关的属性,单独放到一个类中 * 此类必须实现序 ... -
Component 映射
2008-12-19 09:54 682在hibernate中,component是某个实体的逻辑组成 ... -
继承映射
2008-12-18 21:05 868继承映射分为三种: 1 单表继承:每颗类继承树使用一个表(ta ... -
LAZY策略
2008-12-18 14:26 738hibernate lazy策略可以使用在: * <cl ... -
Many-to-Many
2008-12-18 10:36 785hibernate多对多关联映射(单向User----> ... -
one-to-many
2008-12-17 20:19 1062hihernate一对多关联映射 ... -
session --------- flush() 和 evict()
2008-12-17 14:00 2272session flush方法主要做了 ... -
数据库隔离级别
2008-12-17 13:57 822隔离级别 脏读 不可重复读 幻读 R ... -
One-to-one( 2 唯一外键关联)
2008-12-17 11:12 913hibernate一对一唯一外键关联映射(单向关联Person ... -
one-to-one(1主键关联)
2008-12-16 20:23 1780主键关联-----单向 <class name=&qu ... -
many-to-one
2008-12-16 20:15 753<class name="com.bjsx ... -
Hibernate3包问题org/slf4j/impl/StaticLoggerBinder
2008-12-15 13:55 4267Exception in thread "main& ...
相关推荐
本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...
**hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...
【PHP查询缓存】是指在PHP应用程序中,为了提高数据库查询效率和减轻数据库负载,将SQL查询的结果存储起来,下次相同查询时直接读取缓存数据,而不是重新执行查询。这种方式特别适用于那些频繁且静态的数据,可以...
本代码通过使用spring aop+ehcache的技术,实现了方法级别的查询缓存,主要原理是 方法的完整路径+方法参数值,作为key,放入cache中,下次访问时先判断cache中是否有该key.
在 Hibernate 中,二级缓存和查询缓存是提高应用性能的重要机制。下面将详细介绍如何开启并理解这两个缓存机制。 ### 1. 一级缓存与二级缓存 #### 1.1 一级缓存 一级缓存是 Hibernate 内置的 Session 缓存,它是每...
### 释放查询潜力:深度配置 MySQL 查询缓存 #### MySQL 概览 MySQL 是一个流行的开源关系型数据库管理系统(RDBMS),广泛应用于 Web 应用程序的后端数据存储。它基于结构化查询语言(SQL)进行数据管理,是 LAMP...
在深入探讨Hibernate查询缓存之前,我们先了解一下Hibernate的基础概念。Hibernate是一个强大的Java持久化框架,它简化了数据库操作,提供了对象关系映射(ORM)功能。在Hibernate中,对象的状态分为瞬时态、持久态...
【标题】:“Hibernate查询缓存及实现.PPT” 【描述】:“Hibernate查询缓存及实现.PPT” 在本文中,我们将深入探讨Hibernate框架中的查询缓存机制及其实施步骤,这是一项旨在提高应用程序性能的重要功能。查询...
MySQL 执行过程与查询缓存是数据库操作中的关键环节,理解这一过程对于优化数据库性能至关重要。MySQL 的执行流程包括以下几个步骤: 1. **客户端发送查询**:当用户通过MySQL客户端发送一条SQL查询时,这个请求会...
今天我们要探讨的是Hibernate的二级缓存,特别是查询缓存这一重要特性。 首先,我们需要理解缓存的概念。缓存是一种存储技术,用于临时存放经常访问的数据,以减少对主存储器(如数据库)的访问,从而提高系统性能...
而查询缓存是语义缓存的一种,在 SQL解析与查询执行之间,通过研究查询缓存的自主管理来提高数据库的查询性能。首先介绍了数据库常用的语义缓存与自主计算,然后对查询缓存进行了形式化定义,并提出了自适应的查询...
Freyja是一个专为提升查询效率而设计的开源工具,其核心特性就是强大的查询缓存功能。这篇博客将深入解析Freyja如何通过缓存机制来优化数据库操作,帮助开发者提高应用性能。 首先,我们要理解查询缓存的基本概念。...
查询缓存是MySQL数据库系统中的一个重要特性,用于提高查询性能,通过存储已执行过的SQL查询结果,以便后续相同的查询可以直接从缓存中获取结果,而不是重新执行查询。维护和调优查询缓存对于优化数据库性能至关重要...
在MySQL数据库系统中,查询缓存(Query Cache)是一个旨在提高性能的重要特性,它通过存储已执行查询的结果集来避免对相同查询的重复解析、优化和执行过程。然而,如同【标题】和【描述】中提到的情况,不当配置的...
本教程将基于“Redis从入门到精通(四)Redis实战(二)商户查询缓存”的主题,深入探讨如何利用Redis来实现商户查询的高效缓存策略。我们将通过测试项目代码来理解这一过程。 首先,让我们理解Redis缓存的基本概念。...