一、 一级缓存
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缓存深入详解** 在Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着应用规模的扩大,数据访问性能成为了一个不可忽视的问题。这时,...
【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是...
**标题:“Hibernate缓存与Spring事务详解”** 在IT领域,尤其是Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。而Spring框架则以其全面的功能,包括依赖注入、AOP(面向切...
**Hibernate缓存详解** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。为了提高数据访问性能,Hibernate引入了缓存机制,它可以减少对数据库的直接访问,从而提升应用的...
### Hibernate缓存机制及优化策略 #### 一、概述 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域被广泛应用于数据库操作。它提供了丰富的缓存机制来提高应用性能并降低数据库访问压力。本文将...
**Hibernate 二级缓存总结整理** 在Java的持久化框架中,Hibernate是一个广泛使用的ORM(对象关系映射)工具,它极大地简化了数据库操作。在处理大数据量或高并发的场景下,为了提高性能和减少数据库负载,...
这篇博客文章“hibernate缓存ehcache用法”可能详细介绍了如何在Hibernate中配置和使用Ehcache。 首先,我们需要理解什么是缓存。缓存是一种存储技术,用于临时保存经常访问的数据,以减少对主存储器(如数据库)的...
文档"Hibernate_二级缓存总结 开发技术 - Java.doc"可能详细阐述了如何配置和使用Hibernate的二级缓存,包括配置文件的设置、缓存提供者的选用、实体和集合的缓存配置,以及实战中的优化技巧。阅读该文档将有助于...
【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用程序和数据库之间,减少了对数据库的直接访问,从而提高了整体运行效率。缓存主要分为一级缓存...
Hibernate缓存机制是提高应用程序性能的关键特性,尤其是在频繁与数据库交互的应用中。缓存通过减少对物理数据库的直接访问次数,显著提升了数据读取和写入的速度。这主要是因为从缓存中读取数据比从数据库中获取更...
总结来说,Hibernate 的一级缓存和二级缓存都是为了提高数据访问效率,但它们在范围和并发控制方面有所不同。一级缓存是事务级别的,保证了数据的强一致性,而二级缓存提供了更多的灵活性,可以跨事务共享,但需要...
总结,理解并熟练运用Hibernate的二级缓存和分页功能,能帮助我们构建高效、稳定的企业级应用。在具体实现时,还需要根据业务需求和系统环境选择合适的缓存策略和分页方案。文件`s.7z`和`h.7z`可能包含示例代码或...
总结来说,本压缩包“java开发常用jar包之hibernate缓存.rar”包含了关于Hibernate缓存的重要知识点,包括一级缓存、二级缓存的概念、作用、实现策略以及配置方法。理解和熟练运用这些知识,能帮助Java开发者提升...
总结来说,Hibernate的二级缓存和查询缓存是提升性能的重要手段,但正确配置和使用它们至关重要,以免带来不必要的性能损失。通过合理的缓存策略和配置,可以有效地减少数据库交互,提升应用的响应速度。
描述中提到的链接可能是对Hibernate缓存机制的详细技术博客,但具体内容未给出。因此,我们将基于常规的Hibernate缓存知识进行解释。 **一、Hibernate一级缓存** 一级缓存是每个Hibernate Session内的缓存,它是一...
**hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...
Hibernate 提供了缓存策略以提高性能,包括一级缓存(Session 缓存)和二级缓存(可选,如 EhCache)。一级缓存是自动管理的,而二级缓存需要额外配置并管理。 **事务管理** Hibernate 支持编程式事务管理和声明式...