`
kidiaoer
  • 浏览: 821818 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Hibernate中的缓存总结

阅读更多
Hibernate中的缓存总结

    Hibernate 中为了提高数据库访问性能,往往会使用到其缓存机制,而其缓存机制也往往是刚学习Hibernate的新手所迷惑的地方。下面我就此结合自己的经验来总结一下Hibernate中二级缓存、查询缓存与颁布式缓存的相关异同点。

二级缓存和查询缓存都相当于一个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操作。
分享到:
评论

相关推荐

    Hibernate 二级缓存 总结整理

    **Hibernate 二级缓存总结整理** 在Java的持久化框架中,Hibernate是一个广泛使用的ORM(对象关系映射)工具,它极大地简化了数据库操作。在处理大数据量或高并发的场景下,为了提高性能和减少数据库负载,...

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

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

    HIBERNATE的缓存机制

    Hibernate缓存机制是提高应用程序性能的关键特性,尤其是在频繁与数据库交互的应用中。缓存通过减少对物理数据库的直接访问次数,显著提升了数据读取和写入的速度。这主要是因为从缓存中读取数据比从数据库中获取更...

    Hibernate缓存深入详解

    【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是...

    Hibernate的缓存策略

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

    hibernate一级缓存和二级缓存的区别与联系

    总结来说,Hibernate 的一级缓存和二级缓存都是为了提高数据访问效率,但它们在范围和并发控制方面有所不同。一级缓存是事务级别的,保证了数据的强一致性,而二级缓存提供了更多的灵活性,可以跨事务共享,但需要...

    Hibernate二级缓存

    总结来说,Hibernate的二级缓存和查询缓存是提升性能的重要手段,但正确配置和使用它们至关重要,以免带来不必要的性能损失。通过合理的缓存策略和配置,可以有效地减少数据库交互,提升应用的响应速度。

    Hibernate缓存深入详解 from ITEye

    **Hibernate缓存深入详解** 在Java企业级应用开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,随着应用规模的扩大,数据访问性能成为了一个不可忽视的问题。这时,...

    hibernate一级缓存、二级缓存和查询缓存

    本文将详细讲解Hibernate中的三级缓存:一级缓存、二级缓存和查询缓存。 ### 1. 一级缓存 一级缓存是Hibernate内置的Session级别的缓存,也被称为事务性缓存。每当我们在Session中进行对象的CRUD(创建、读取、...

    hibernate缓存ehcache用法

    这篇博客文章“hibernate缓存ehcache用法”可能详细介绍了如何在Hibernate中配置和使用Ehcache。 首先,我们需要理解什么是缓存。缓存是一种存储技术,用于临时保存经常访问的数据,以减少对主存储器(如数据库)的...

    hibernate的缓存机制

    **标题:“Hibernate的缓存机制”** 在Java的持久化框架Hibernate中...总结来说,Hibernate的缓存机制是提升应用性能的重要手段,但正确使用和管理缓存至关重要,需要根据实际需求和场景来权衡利弊并进行细致的配置。

    hibernate 二级缓存详解

    总结来说,Hibernate的二级缓存是提升性能的关键手段,通过合理配置和使用,可以有效减少数据库交互,提高应用响应速度。需要注意的是,二级缓存虽然强大,但也需谨慎使用,防止数据一致性问题,尤其是在高并发环境...

    Hibernate_二级缓存总结

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

    Hibernate一级缓存和二级缓存

    描述中提到的链接可能是对Hibernate缓存机制的详细技术博客,但具体内容未给出。因此,我们将基于常规的Hibernate缓存知识进行解释。 **一、Hibernate一级缓存** 一级缓存是每个Hibernate Session内的缓存,它是一...

    hibernate缓存总结

    总结,Hibernate缓存机制是其性能优化的重要手段,通过理解并合理利用一级缓存、二级缓存和查询缓存,能够显著提升应用的运行效率。然而,缓存的使用也需谨慎,以免引发数据一致性问题。开发者应结合实际业务场景,...

    hibernate缓存

    ### Hibernate缓存机制及优化策略 #### 一、概述 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域被广泛应用于数据库操作。它提供了丰富的缓存机制来提高应用性能并降低数据库访问压力。本文将...

    Hibernate的缓存应用

    Hibernate中的缓存主要用于存储已经加载过的实体对象及其关联数据,这样在后续的查询过程中就可以避免不必要的数据库访问,直接从缓存中获取数据,大大提高了查询速度。根据不同的应用场景,Hibernate提供了不同级别...

    Hibernate二级缓存+分页功能

    总结,理解并熟练运用Hibernate的二级缓存和分页功能,能帮助我们构建高效、稳定的企业级应用。在具体实现时,还需要根据业务需求和系统环境选择合适的缓存策略和分页方案。文件`s.7z`和`h.7z`可能包含示例代码或...

    Hibernate缓存详解

    **Hibernate缓存详解** 在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。为了提高数据访问性能,Hibernate引入了缓存机制,它可以减少对数据库的直接访问,从而提升应用的...

Global site tag (gtag.js) - Google Analytics