二级缓存和查询缓存都相当于一个map。
二级缓存缓存的key为id,value为实体对象。一般load(),iterate()使用到二级缓存,list()需要结合查询缓存使用。iterate()和list()区别如下:
iterate()不需要开启查询缓存,它首先发出一个sql如”select s.id from Student s”去数据库把id属性列表取出来,然后再根据id列表一个一个load(),如果缓存有从缓存取,如果缓存没有就从数据库取:select s.id,s.name,s.classid from Student s where s.id=?,取出后再存入二级缓存。Iterate总会发出取id列表的语句。
List()需要开启查询缓存,它首先发出一个sql如”select s.id,s.name,s.classid from Student s…”去数据库取出所有相关实体,并将这些实体存入二级缓存,将此sql语句及一些相关信息作为key,id列表作为值,第二次查询这条语句时就会去根据sql语句及相关信息去key里找,如果有就会把id列表取出一个一个load(),接下来就和iterate一样了。List一般只有第一次发发出取实体列表的语句,以后的id列表就会去查询缓存取id列表,不会再发出sql语句。
前提:执行同一hql语句,如:select s from Student s
1. 关闭查询缓存,开启二级缓存时:
第二次查询属性时iterate只会发出获取id列表的sql,list会发出和第一次一样的请求实体的sql。
2. 开启查询缓存,开启二级缓存
第二次查询属性时iterate只会发出获取id列表的sql,list不发sql。
以上说明iterate只和二级缓存有关,list和二级缓存和查询缓存都有关。
|
查询缓存的key是一个QueryKey(其属性如下),value为id集合。
public class QueryKey implements Serializable {
private final String sqlQueryString;//sql语句
private final Type[] types;
private final Object[] values;
private final Integer firstRow;//要查询的起始数
private final Integer maxRows;//要查询的个数
private final Map namedParameters;
private final EntityMode entityMode;
private final Set filters;
private final int hashCode;
......
}
如果以上属性中有一个不同,查询缓存就不会命中。使用list()时,如果是第一次,查询缓存取出实体列表,然后从实体列表中提取出id列表作为value。如果是查询缓存命中,就会根据QueryKey取出id列表,然后根据id列表去二级缓存中load()对象,如果二级缓存中没有哪个对象,就会根据id去数据库查询,二级缓存中没有n个对象就会去数据库查询n次:select p from pojo p where id=?,因此就会有机会出现传说中n+1问题。
在查询缓存中,查询缓存缓存普通属性,即对于属性的查询,value值为要查询的属性列表,对于实体,value值为实体的id列表,而对于属性的查询由于从value中直接可以查出就不会用到二级缓存,但对于实体的查询,必须结合二级缓存使用。下面对此进行说明:
前提:执行同一hql语句,如:select s from Student s或select s.name from Student s
1. 开启查询缓存,关闭二级缓存时:
第二次查询属性时不会发出sql,第一次查询实体时会发出sql。
2. 开启查询缓存,开启二级缓存
第二次查询属性,实体时都不发sql
|
对于Ehcache分布式缓存,好像查询缓存不能更新:
在同一系统中,当用Hibernate的方式修改表数据(save,update,delete等等),这时EhCache会自动把缓存中关于此表的所有缓存全部删除掉(这样能达到同步)。但对于两个以上系统部署在不同机子上,并在他们之间配置了ehcache的分布式缓存,当A系统修改表数据(save,update,delete)后,b系统会更新查询缓存吗?
答:好像是不能的,即ehcache的分布式缓存对查询缓存无效。(我在项目中配置了Ehcache的分布式缓存,二级缓存可以生效,但查询缓存不能更新。是不是一个系统中的Hibernate不能够识别其他系统中hibernate是否进行了save,update,delete操作?而Ehcache也没对此进行整合,望知道的大牛给说一下。)
|
本文出自 “青山” 博客,请务必保留此出处http://java999.blog.51cto.com/259217/232572
相关推荐
### 配置EhCache二级缓存 #### 一、简介 EhCache是一个高性能、易于使用的开源缓存系统,最初由 Terracotta 组织开发。它支持多种缓存模型,包括本地缓存和分布式缓存。由于其简单易用且功能强大,EhCache 成为了 ...
总结,Ehcache二级缓存的配置涉及到多个方面,包括缓存管理、内存和磁盘存储、过期策略以及与Spring的集成。正确配置和使用Ehcache可以显著提高应用程序的响应速度和整体性能。在实际应用中,需要根据业务需求进行...
当我们谈论“Spring + Ehcache + Redis”两级缓存时,我们实际上是在讨论如何在Java环境中利用Spring框架来集成Ehcache作为本地缓存,并利用Redis作为分布式二级缓存,构建一个高效且可扩展的缓存解决方案。...
Ehcache是Hibernate支持的二级缓存提供者之一,它具有高效、可扩展和易于配置的特点。Ehcache分为两种缓存区域:**Session级缓存** 和 **Region级缓存**。Session级缓存只存在于当前SessionFactory的生命周期内,而...
总结来说,Hibernate 的一级缓存和二级缓存都是为了提高数据访问效率,但它们在范围和并发控制方面有所不同。一级缓存是事务级别的,保证了数据的强一致性,而二级缓存提供了更多的灵活性,可以跨事务共享,但需要...
通过深入理解并实践这个源码实例,开发者可以掌握如何在实际项目中有效利用Hibernate的二级缓存,以及如何结合memcached实现高效的分布式缓存策略。这不仅能够提升应用程序的性能,还能降低对数据库的压力,是现代...
### Ehcache分布式缓存及其在Spring中的应用 #### 一、Ehcache概述与原理 Ehcache是一款高效且轻量级的纯Java缓存框架,由于其出色的性能和易于集成的特点,在Java开发中有着广泛的应用。作为Hibernate的默认缓存...
二级缓存:是SessionFactory对象缓存,可以被创建出的多个 Session 对象共享,二级缓存默认是关闭的,如果要使用需要手动开启,并且依赖EhCache组件。 三级缓存:查询缓存,配置开启该缓存的情况下,重复使用一个...
Ehcache是Java平台上的一个开源、高性能的分布式缓存系统,它在处理大量用户访问主页或频繁操作某些数据时,能显著提升系统的响应速度和效率。本篇文章将深入探讨Ehcache项目的缓存技术及其应用。 一、Ehcache简介...
然而,对于多线程和分布式环境,二级缓存可能导致数据一致性问题,因此需要谨慎使用,并可能需要引入分布式缓存来解决一致性问题。 分布式缓存,例如在集群环境中,涉及到多个应用实例和JVM之间的数据共享。通过...
Ehcache提供了本地缓存、分布式缓存以及缓存的持久化等功能,这使得它成为Hibernate二级缓存的理想选择。在提供的压缩包中,包含了Ehcache的两个不同版本:1.2.3和3.0.2。 1.2.3版的Ehcache是较早的一个稳定版本,...
在本压缩包“hibernate二级缓存包”中,重点包含的是 Ehcache 这个流行且广泛使用的二级缓存实现。 Ehcache 是一个开源的、高性能的缓存解决方案,它可以被集成到各种Java应用中,包括Hibernate框架。Ehcache 提供...
Ehcache 是一个广泛使用的开源缓存解决方案,它支持本地缓存和分布式缓存,与 Hibernate 集成方便,可以提供高效的二级缓存服务。Infinispan 则是一个更强大的内存数据网格,不仅提供缓存功能,还支持数据分布式存储...
默认情况下,Hibernate提供了第一级缓存——Session缓存,但对于更复杂的缓存需求,如跨Session的共享缓存,Ehcache则作为第二级缓存被引入。第二级缓存可以存储更多数据,减少对数据库的依赖,提高并发性能。 **...
此外,Ehcache还支持二级缓存,当一级缓存满时,数据会自动存入二级缓存(如硬盘)。 总结来说,Ehcache是一个强大的Java缓存解决方案,它简化了缓存的管理和使用。通过合理的配置和使用,我们可以显著提高应用程序...
Ehcache的核心特性包括:高效的缓存管理、内存和硬盘的二级缓存、缓存过期策略以及分布式缓存支持。这些特性使得Ehcache成为Java开发中的理想选择,尤其是在高并发、大数据量场景下,能够显著提高页面加载速度,减轻...
1. 减少数据库操作:二级缓存可以存储查询结果,避免频繁地执行相同的SQL查询,从而减轻数据库负载。 2. 提高响应速度:由于数据位于内存中,访问速度比磁盘上的数据库快得多,提升了应用程序的响应速度。 3. 支持...
今天我们将重点关注Hibernate的二级缓存,并以EHcache作为实现二级缓存的插件进行深入探讨。 **一、Hibernate二级缓存** 二级缓存是Hibernate中的一个可选特性,用于存储那些频繁访问但不经常变化的数据。与一级...
- 第二级缓存:SessionFactory实例间的共享缓存,跨Session存储数据,提高多个并发请求的效率。 4. **缓存更新与失效** - 更新策略:当数据发生变化时,需要同步更新缓存,可以使用`@CacheEvict`注解实现缓存的...