一、 一级缓存
1. 一级缓存只缓存整个对象,不能缓存对象属性;
2. 一级缓存是 Session 级的缓存,不能跨多个 Session 对象来使用;
3. Session 的 load/get 方法支持一级缓存的读和写;
4. Query 的 list 接口只支持一级缓存的写入,不能从一级缓存中读出对象。 list 接口加载对象要发出 SQL ;
5. Query 的 iterate 接口既支持一级缓存的写入,也能从一级缓存中读取对象(如果有的话)。每次用 iterate 接口查询对象,都要先发 SQL 加载查询对象的 id 列表。如果需要用到某个对象,则根据该对象的 id 从一级缓存中查询,有则直接加载,没有则发出 SQL 从数据库加载(这时会出现 1+N 问题)。
6. Session 的 save 方法会将 save 的对象放入一级缓存中,因此如果要 save 大批对象,则应该要及时清空一级缓存,可以采用 Session 的 clear() 方法。
7. 一级缓存是 hibernate 默认使用的,无需配置即可使用。
二、 二级缓存
1. 二级缓存也是只能缓存整个对象,不能缓存对象属性,而且对 load/get 方法、 list/iterate 方法的在使用上跟一级缓存一样。
2. 与一级缓存不同,二级缓存是 SessionFactory 级的缓存,它允许多个 Session 对象之间共用。
3. 使用二级缓存前必须进行一些准备步骤(以 EhCache 为例 ):
(1) 需要有 EhCache 的 xml 配置文件(设置 EhCache 的“缓存对象最大数目”、“对象是否不失效”、“对象允许的空闲时间”、“对象的生存时间”及“对象数目超额时是否缓存至磁盘”);
(2) 在总配置文件 hibernate.cfg.xml 中启用二级缓存(默认开启,无需显示配置):
< property name = "hibernate.cache.use_second_level_cache" > true </ property >
(3) 指定二级缓存的供应商:
< property name = "hibernate.cache.provider_class" > org.hibernate.cache.EhCacheProvider </ property >
(4) 指定需要缓存的类及缓存方式(可在 hibernate.cfg.xml 或对应的类的 .hbm.xml 中配置):
在 hibernate.cfg.xml 中配置:
< class-cache usage = "read-only" class = "my.Student" />
在 Student.hbm.xml 中配置(必须在配置 id 前完成):
< cache usage = "read-only" />
(5) 可以通过 Session 动态设置是否允许对二级缓存进行读和写,方法是: session.setCacheMode(CacheMode.GET) 和 session.setCacheMode(CacheMode.PUT)
(6) SessionFactory 的 evit() 会将一个对象逐处二级缓存。
三、 查询缓存
查询缓存是专为 Query 的 list 方法设计的。对于 iterate() 方法,无论是查询对象属性还是对象本身,查询缓存用与不用都没有区别!
1. 用查询缓存查询属性:
(1) 查询缓存必须要在 hibernate.cfg.xml 中显示启用:
< property name = "hibernate.cache.use_query_cache" > true </ property >
(2) 在代码中如果要用到查询缓存(无论是写还是读缓存),都要进行开启操作,可通过 Query 的 setCacheable( true ) 方法开启;
(3) 查询缓存的生命周期 与 Session 无关(可以跨 Session 查询 ),当查询关联的表发生改变,那么查询缓存的生命周期结束 ( delete 、 update 、 modify )
(4) 开启查询缓存,并用 Query 查询对象的属性(可以是一个或多个)时,采用 Query 的 list 方法可以把得到的属性集合写入查询缓存中。如果查询缓存已经有了该对象的属性,那么就不会发出 SQL 而直接从查询缓存中取出来;
2. 用查询缓存查询对象:
(5) 如果开启查询缓存并通过 list 接口查询对象,在首次查询时会发出 SQL 从数据库中获取对象,同时将对象的 id 列表放入查询缓存中 ;如果再次用查询缓存查询对象,则会根据该对象的 id 发出 SQL 从数据库中加载对象(这时会发出 N 条 SQL 语句)
(6) 如果同时开启查询和二级缓存,那么(5 )中就不会发出 N 条 SQL 语句了,而是直接从二级缓存中加载。(此时的 list 接口有了读二级缓存的能力了!!!)
分享到:
相关推荐
描述中提到的链接可能是对Hibernate缓存机制的详细技术博客,但具体内容未给出。因此,我们将基于常规的Hibernate缓存知识进行解释。 **一、Hibernate一级缓存** 一级缓存是每个Hibernate Session内的缓存,它是一...
在 Hibernate 中,二级缓存和查询缓存是提高应用性能的重要机制。下面将详细介绍如何开启并理解这两个缓存机制。 ### 1. 一级缓存与二级缓存 #### 1.1 一级缓存 一级缓存是 Hibernate 内置的 Session 缓存,它是每...
文档"Hibernate_二级缓存总结 开发技术 - Java.doc"可能详细阐述了如何配置和使用Hibernate的二级缓存,包括配置文件的设置、缓存提供者的选用、实体和集合的缓存配置,以及实战中的优化技巧。阅读该文档将有助于...
总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...
### Hibernate二级缓存技术详解 #### 一、概述 Hibernate 是一个开源的对象关系映射(ORM)框架,它简化了Java应用与关系型数据库之间的交互。为了提高性能和减少数据库的访问频率,Hibernate 提供了一级缓存和二...
在Hibernate框架中,缓存主要分为一级缓存和二级缓存。 **1. 一级缓存** 一级缓存是Session级别的,每个Session都有自己的缓存空间。当我们在Session内进行操作时,例如增删改查,这些操作的对象会被保存在一级缓存...
Hibernate二级缓存是Java开发中使用Hibernate框架进行数据持久化时优化性能的一种重要技术。它在一级缓存(Session级别的缓存)的基础上,提供了一个全局的、跨会话的数据存储层,可以显著减少对数据库的访问,从而...
与一级缓存相比,二级缓存的生命周期更长,但它的数据一致性相对较弱,因为数据库的更新可能不会立即反映在二级缓存中。 二级缓存数据存储结构通常是键值对的形式,其中键是对象的标识(ID),值是对象的序列化形式...
在学习Hibernate的过程中,二级缓存是一个非常重要的概念。与一级缓存不同的是,一级缓存默认为每个`Session`开启,用于存储当前`Session`内的实体状态。而二级缓存则是在`SessionFactory`级别提供的缓存机制,它...
### Hibernate缓存技术研究 #### 一、引言 Hibernate是一种强大的对象-关系映射(Object-Relational Mapping,简称ORM)工具,主要用于Java环境下的应用程序。它能够将应用程序中的对象模型映射到关系型数据库的表...
Ehcache是Hibernate的一个可选二级缓存插件,用于存储数据库查询结果,减少对数据库的直接访问。当相同的数据再次被请求时,可以从缓存中快速获取,提高系统响应速度。在不使用缓存的情况下,可以通过配置关闭。 5...
在IT行业中,数据库缓存是提高系统性能的关键技术之一,特别是在高并发的Web应用中。本文将详述如何在项目中使用Hibernate与Memcached结合实现二级缓存,并探讨Memcached的基本原理和使用方法。 首先,我们需要理解...
在Java的持久化框架Hibernate中,缓存技术是提升系统性能的关键之一。本文将深入探讨Hibernate的二级缓存,包括其事务范围、进程范围和集群范围的配置,特别是关注进程范围内的EhCacheProvider以及查询缓存的配置。 ...
今天我们要探讨的是Hibernate的二级缓存,特别是查询缓存这一重要特性。 首先,我们需要理解缓存的概念。缓存是一种存储技术,用于临时存放经常访问的数据,以减少对主存储器(如数据库)的访问,从而提高系统性能...
Hibernate提供了两种缓存机制:一级缓存和二级缓存。一级缓存是默认开启的,主要用于事务间的缓存管理;而二级缓存则更侧重于应用间的缓存共享,旨在提高数据读取效率,减少不必要的数据库交互。 #### 二、一级缓存...
Hibernate二级缓存是Java开发中使用Hibernate框架时提高性能的重要机制。它是一种持久化层缓存,用于存储从数据库中加载的对象,以便后续请求可以快速访问这些数据,而无需每次都直接查询数据库。在大型应用程序中,...
首先,我们需要在Hibernate配置文件(hibernate.cfg.xml)中启用二级缓存,并指定Ehcache为缓存提供者: ```xml <property name="hibernate.cache.use_second_level_cache">true <property name="hibernate.cache....
在Hibernate框架中,一级缓存和二级缓存各自承担着不同的角色,通过合理的设计和配置,可以充分发挥缓存的优势,显著提升系统的性能和用户体验。在实际项目中,开发者应根据具体需求灵活运用这两种缓存机制,以达到...
在多线程或多进程环境中,二级缓存需要确保数据一致性,这可能需要借助于并发控制策略和数据复制技术。 **4. 二级缓存的高级应用(分布式缓存)** 在大型分布式系统中,二级缓存可能需要扩展为分布式缓存,如使用...
Hibernate缓存主要分为一级缓存和二级缓存。一级缓存,也称为会话缓存(Session Cache),是默认启用的,由Hibernate自动管理。它存储了当前会话期间加载的所有实体对象和关联的集合对象。当会话关闭时,一级缓存中...