`

Hibernate中一级缓存、二级缓存及查询缓存的技术性总结

阅读更多

一、 一级缓存

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一级缓存** 一级缓存是每个Hibernate Session内的缓存,它是一...

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

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

    Hibernate-二级缓存总结 开发技术 - Java.zip

    文档"Hibernate_二级缓存总结 开发技术 - Java.doc"可能详细阐述了如何配置和使用Hibernate的二级缓存,包括配置文件的设置、缓存提供者的选用、实体和集合的缓存配置,以及实战中的优化技巧。阅读该文档将有助于...

    hibernate二级缓存实例

    总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...

    Hibernate二级缓存技术

    ### Hibernate二级缓存技术详解 #### 一、概述 Hibernate 是一个开源的对象关系映射(ORM)框架,它简化了Java应用与关系型数据库之间的交互。为了提高性能和减少数据库的访问频率,Hibernate 提供了一级缓存和二...

    Hibernate_二级缓存总结

    在Hibernate框架中,缓存主要分为一级缓存和二级缓存。 **1. 一级缓存** 一级缓存是Session级别的,每个Session都有自己的缓存空间。当我们在Session内进行操作时,例如增删改查,这些操作的对象会被保存在一级缓存...

    hibernate二级缓存包

    Hibernate二级缓存是Java开发中使用Hibernate框架进行数据持久化时优化性能的一种重要技术。它在一级缓存(Session级别的缓存)的基础上,提供了一个全局的、跨会话的数据存储层,可以显著减少对数据库的访问,从而...

    Hibernate一级缓存和二级缓存【内附二级缓存数据存储结构】

    与一级缓存相比,二级缓存的生命周期更长,但它的数据一致性相对较弱,因为数据库的更新可能不会立即反映在二级缓存中。 二级缓存数据存储结构通常是键值对的形式,其中键是对象的标识(ID),值是对象的序列化形式...

    Hibernate_二级缓存 实验心得,手册

    在学习Hibernate的过程中,二级缓存是一个非常重要的概念。与一级缓存不同的是,一级缓存默认为每个`Session`开启,用于存储当前`Session`内的实体状态。而二级缓存则是在`SessionFactory`级别提供的缓存机制,它...

    Hibernate缓存技术研究

    ### Hibernate缓存技术研究 #### 一、引言 Hibernate是一种强大的对象-关系映射(Object-Relational Mapping,简称ORM)工具,主要用于Java环境下的应用程序。它能够将应用程序中的对象模型映射到关系型数据库的表...

    Hibernate二级缓存(Ehcache)

    首先,我们需要在Hibernate配置文件(hibernate.cfg.xml)中启用二级缓存,并指定Ehcache为缓存提供者: ```xml &lt;property name="hibernate.cache.use_second_level_cache"&gt;true &lt;property name="hibernate.cache....

    springmvc4+spring4+hibernate5.1.3+二级缓存ehcache+fastjson配置

    Ehcache是Hibernate的一个可选二级缓存插件,用于存储数据库查询结果,减少对数据库的直接访问。当相同的数据再次被请求时,可以从缓存中快速获取,提高系统响应速度。在不使用缓存的情况下,可以通过配置关闭。 5...

    项目中使用 hibernate-memcached 做二级缓存

    在IT行业中,数据库缓存是提高系统性能的关键技术之一,特别是在高并发的Web应用中。本文将详述如何在项目中使用Hibernate与Memcached结合实现二级缓存,并探讨Memcached的基本原理和使用方法。 首先,我们需要理解...

    Hibernate二级缓存配置详解

    在Java的持久化框架Hibernate中,缓存技术是提升系统性能的关键之一。本文将深入探讨Hibernate的二级缓存,包括其事务范围、进程范围和集群范围的配置,特别是关注进程范围内的EhCacheProvider以及查询缓存的配置。 ...

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

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

    Hibernate二级缓存.doc

    Hibernate提供了两种缓存机制:一级缓存和二级缓存。一级缓存是默认开启的,主要用于事务间的缓存管理;而二级缓存则更侧重于应用间的缓存共享,旨在提高数据读取效率,减少不必要的数据库交互。 #### 二、一级缓存...

    hibernate二级缓存

    Hibernate二级缓存是Java开发中使用Hibernate框架时提高性能的重要机制。它是一种持久化层缓存,用于存储从数据库中加载的对象,以便后续请求可以快速访问这些数据,而无需每次都直接查询数据库。在大型应用程序中,...

    Hibernate的缓存策略

    在Hibernate框架中,一级缓存和二级缓存各自承担着不同的角色,通过合理的设计和配置,可以充分发挥缓存的优势,显著提升系统的性能和用户体验。在实际项目中,开发者应根据具体需求灵活运用这两种缓存机制,以达到...

    Hibernate缓存深入详解

    在多线程或多进程环境中,二级缓存需要确保数据一致性,这可能需要借助于并发控制策略和数据复制技术。 **4. 二级缓存的高级应用(分布式缓存)** 在大型分布式系统中,二级缓存可能需要扩展为分布式缓存,如使用...

    Hibernate缓存,性能优化

    Hibernate缓存主要分为一级缓存和二级缓存。一级缓存,也称为会话缓存(Session Cache),是默认启用的,由Hibernate自动管理。它存储了当前会话期间加载的所有实体对象和关联的集合对象。当会话关闭时,一级缓存中...

Global site tag (gtag.js) - Google Analytics