`
kidiaoer
  • 浏览: 807856 次
  • 性别: 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-二级缓存总结 开发技术 - Java.zip

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

    Hibernate缓存技术研究

    Hibernate是一种面向Java环境的ORM工具。系统地分析了Hibernate的缓存结构,并描述了二级缓存的查询过程、缓存策略;同时总结了二级缓存使用中的一些限制,以及使用二级缓存的优化策略。

    Hibernate_二级缓存总结

    1. 启用查询缓存:在 hibernate .cfg.xml 中加入: ”hibernate .cache.use_query_cache”>true</property> 2. 在程序中必须手动启用查询缓存,如: query.setCacheable(true); QueryCache 用来缓存查询语句 , 及...

    Hibernate 二级缓存 总结整理

    NULL 博文链接:https://jinnianshilongnian.iteye.com/blog/1525884

    hibernate缓存总结

    SHH两年工作经验:hibernate缓存总结和优化

    hibernate 二级缓存收集、总结、整理

    hibernate 二级缓存原理规律总结,总结、整理了二级缓存方面的实际运用情况

    hibernate二级缓存

    在一个数据库系统中,如果缓存设置的合适,那么可以极大的提高系统的效率,Hibernate作为一个ORM工具 提供了缓存的机制,包括一级(Session级)缓存和二级(SessionFactory级)缓存。这里主要总结一下二级缓存。 1....

    hibernate文档总结,技术汇总,PDF版的,hibernate简明参考文档

    hibernate文档总结,技术汇总,PDF版的 如果想复习hibernate,了解hibernate新技术,这个真的很不错....里面介绍了很多hibernate常用的插件,hibernate配置文件,hibernate原理,hibernate缓存机制.你选它,真的没有错.

    hibernate的_映射、三态、脏数据、Session缓存

    hibernate的_映射、三态、脏数据、Session缓存,一个高手的总结,个人觉得很厉害,和大家一起分享

    hibernate 缓存机制

    hibernate 的缓存机制 总结,供您参考,希望对你有所帮助

    Hibernate+中文文档

    3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of ...

    hibernate3.2中文文档(chm格式)

    3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of ...

    hibernate非常全面总结文档

    该文档全面的简绍了hibernate的用法和区别,以及热门的一级缓存和二级缓存的简绍

    Hibernate中文详细学习文档

    1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得...

    47-二级缓存 Hibernate-Shiro-MyBatis

    在工作中无处不在的二级缓存,Hibernate -- Shiro -- MyBatis 这三个框架都有二级缓存的技术,总结出详细的配置文档。详解了每步的配置!

    Hibernate 中文 html 帮助文档

    1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory 3.3...

    EhCache_Hibernate二级缓存配置_详细

    本人在做项目时用到了Hibernate的二级缓存,使用的是EhCache,结合本人自己的理解总结了如何在java web项目中配合Hibernate使用二级缓存,以提高程序的性能,附带需要的文件,参考的文件,和测试类以及说明。

    HibernateAPI中文版.chm

    3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of ...

    hibernate总结

    d) 在同一个session的缓存中,具有相同OID的持久态对象,只有一个(同一个session的一缓存中,不可能同时有两个OID相同的同一个持久化类的对象存在) 3. 游离态,脱管 a) 不在一级缓存之中 b) 数据库可能有记录和它...

    hibernate+中文api

    3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 ...

Global site tag (gtag.js) - Google Analytics