`

Hibernate查询缓存全面分析

 
阅读更多

这里介绍Hibernate查询缓存对Iterator不起作用,只对List起作用。

缓存分类:
◆一级缓存 Session级
◆二级缓存 SessionFactory级别,JVM级别
◆Hibernate查询缓存不固定(生命周期不固定)

生命周期: 
◆一级缓存 是和 session 会话一致产生一致消失
◆二级缓存 是和 sessionFacotry 一致
◆Hibernate查询缓存 生命周期不固定,当数据库表发生改变,使用Hibernate查询缓存马上消失

使用方法: 
◆一级缓存:这个就不用说了
◆二级缓存:首先拷贝使用Hibernate查询缓存类别.xml到 classpath目录下面,然后到hibernate.cfg.xml里面配置。开启二级缓存(默认开启),定义要使用二级缓存的实体类,然后就是在程序中要显示的指定session。使用二级缓存的类别 有三种,Normal,GET,PUT默认使用的是 Normal即可以写也可以读取二级缓存(这里读写是指的会话Session)
◆Hibernate查询缓存:首先也是到hibernate配置文件中去开启Hibernate查询缓存,然后程序中也要显示的调用方法来开启Hibernate查询缓存eg:query.setCachemodel(true);

缓存的保存对象:
◆一级缓存:缓存实体
◆二级缓存:缓存的也是实体
◆Hibernate查询缓存缓存的是查询出来的实体的部分属性结果集和实体的ID(注意这里不是实体)

缓存的使用对象:
◆一级缓存: 
Load(Lazy加载):首先查找把序列号去和一级缓存匹配是否有,有就直接取出来,如果没有,则发出SQL语句。
Get:也使用一级缓存。
List接口:query.list()不使用一级缓存,每次都要发出SQL eg:(select * from tudent)。
Iterator接口: query.iterate();使用一级缓存。首先是要发出一条SQL来取得ID,eg: select。id from student; 然后把ID拿到缓存中去匹配, 如果有,就直接取,如果没有,就要再发出SQL。如果都没有,将发出N+1条SQL,这就是N+1问题。
◆二级缓存: 都使用了二级缓存。
◆Hibernate查询缓存:对List 和Iterator接口起作用。但是Hibernate查询缓存对Iterator不起作用,只对List起作用。

 

下面我们这种介绍把二级缓存和Hibernate查询缓存结合使用。 
当只是用Hibernate查询缓存而关闭二级缓存的时候: 
第一:如果查询的是部分属性结果集: 那么当第二次查询的时候就不会发出SQL,直接从Hibernate查询缓存中取数据;
第二:如果查询的是实体结果集eg(from Student) ,首先Hibernate查询缓存存放实体的ID,第二次查询的时候就到Hibernate查询缓存中取出ID 一条一条的到数据库查询,这样,将发出N 条SQL造成了SQL泛滥。

当都开启Hibernate查询缓存和二级缓存的时候:
第一:如果查询的是部分属性结果集: 这个和上面只是用Hibernate查询缓存而关闭 二级缓存的时候一致,因为不涉及实体不会用到二级缓存;
第二:如果查询的是实体结果集eg(from Student),首先Hibernate查询缓存存放实体的ID,第二次查询的时候,就到Hibernate查询缓存中取出ID,到二级缓存区找数据,如果有数据,就不会发出SQL;如果都有,一条SQL都不会发出,直接从二级缓存中取数据。
 
总结: 查询缓存的key与HQL,查询参数以及分布参数有关,而且一旦查询涉及到的任何一张表的数据发生了变化,缓存就失效了,所以在生产环境中命中率较低。查询缓存保存的是结果集的id列表,而不是结果集本身 ,命中缓存的时候,会根据id一个一个地先从二级缓存查找 ,找不到再查询数据库。

list()没有使用缓存中的实体对象,因为查询需要查找到所有符合条件的记录,因此必须执行SELECT SQL,来保证查询数据的完整性;而iterate()通过执行SELECT SQL语句来获取满足查询条件的记录的ID,来保证查询数据的完整性

分享到:
评论

相关推荐

    hibernate一级缓存

    3. **缓存查询**:当从数据库中查询数据时,Hibernate首先会在一级缓存中查找,如果找到则直接返回,无需再次访问数据库,这大大提升了查询速度。 ### 一级缓存的生命周期 一级缓存的生命周期与Hibernate的Session...

    hibernate5.2.7-src源码

    4. 缓存配置与使用:分析二级缓存的配置和使用,以及如何通过配置文件和API启用查询缓存。 通过深入学习Hibernate 5.2.7的源码,我们可以更好地理解其内部机制,从而在实际项目中更高效地利用这个强大的ORM框架。这...

    Ibatis和Hibernate的分析比较

    4. 缓存和事务管理:两者都支持缓存和事务,但Hibernate内置了更强大的管理机制。 在选择Ibatis还是Hibernate时,应考虑项目的具体需求、团队的技术背景和性能要求。对于需要高度控制SQL的项目,或者对性能有严格...

    Hibernate面试题分析.zip

    - 缓存策略:一级缓存(Session级缓存)、二级缓存(SessionFactory级缓存)和查询缓存的使用和配置。 - 数据库连接池:如C3P0、DBCP等,提高数据库连接的复用性,降低系统开销。 - 批量操作:利用Hibernate的...

    hibernate实战 英文版

    5. **查询语言**:Hibernate提供了强大的查询语言HQL(Hibernate Query Language),用于执行复杂的数据库查询操作。 6. **高级特性**:除了基础功能之外,本书还涵盖了诸如懒加载、批量更新和删除等高级特性。 ###...

    hibernate经典教材从入门到精通(共四篇)

    第三篇可能涉及到Hibernate的缓存机制,包括一级缓存和二级缓存,以及如何配置和使用第三方缓存服务,如 EhCache 或 Infinispan。此外,事务管理和并发控制也是重要的内容,如乐观锁和悲观锁的概念及其在Hibernate中...

    Hibernate开发指南

    6.缓存机制:讲解Hibernate的缓存策略,包括一级缓存和二级缓存,以及第三方缓存解决方案如 EhCache 和 Infinispan 的集成。 7.性能优化:分享提高Hibernate应用性能的技巧,如延迟加载、批处理、预加载等。 通过...

    02_传智播客hibernate教程_hibernate入门案例的细节分析

    通过传智播客的这个教程,初学者将获得对Hibernate基础的全面理解,特别是如何运用到实际的入门案例中。 【描述】:“02_传智播客hibernate教程_hibernate入门案例的细节分析” 此教程详细剖析了Hibernate入门案例...

    Hibernate 3.5完整包下载路径

    7. **第一级缓存与第二级缓存:** Hibernate通过缓存提高性能,Session级别的缓存是第一级缓存,SessionFactory级别的缓存是第二级缓存。 8. **事务管理:** Hibernate支持JTA(Java Transaction API)和JDBC事务...

    Hibernate高级教程

    11. **性能优化**:讲解如何通过优化查询、延迟加载、缓存策略等手段提高Hibernate应用的性能。 12. **查询优化**:深入讨论SQL和HQL的性能对比,以及如何写出更高效的查询语句。 13. **实体状态管理**:解释...

    hibernate5jar包以及源码

    3. **缓存机制**:Hibernate支持二级缓存,源码中可以深入理解其工作流程,包括查询缓存和实体缓存。 4. **查询语言**:HQL(Hibernate Query Language)和 Criteria API 是Hibernate提供的两种查询方式,源码解析能...

    hibernate中文帮助文档

    **标题与描述解析** 标题"hibernate中文帮助文档"表明了这是一份关于Hibernate的中文...综上,这份压缩包提供的文档涵盖了Hibernate的基本使用到高级特性,结合SQL参考手册,将为Java开发者提供全面的数据库操作指南。

    精通hibernate3.0(第三版).rar

    8. 性能优化:分析和解决Hibernate性能问题,如缓存策略、批处理、连接池配置等,提升应用的运行效率。 9. 高级特性:探讨Hibernate的高级功能,如关联映射、集合映射、继承映射、多态查询、懒加载和代理对象等。 ...

    Hibernate in action 中文版 完整版 pdf

    5. 查询优化:分析了HQL和SQL的性能差异,介绍了如何使用Hibernate的查询优化策略,包括避免N+1查询、批处理和分页查询等。 6. 事务管理:阐述了Hibernate在JTA和JDBC两种事务管理方式下的应用,以及事务的隔离级别...

    hibernate4.3.9

    总结起来,Hibernate 4.3.9 是一个强大且成熟的版本,不仅提供了全面的JPA 2.1支持,还增强了查询能力和性能,优化了缓存策略,同时在事务管理、元数据访问、事件监听等方面做了诸多改进,使得开发人员在处理数据...

    最经典的hibernate教程_从入门到精通(全四篇)

    1. 性能优化:分析Hibernate性能瓶颈,学习如何通过批处理、懒加载、子查询优化等手段提升性能。 2. 扩展性与插件:了解Hibernate的事件监听器、拦截器,以及如何利用Hibernate Tools生成代码和逆向工程。 3. JPA与...

    Hibernate3.2整套源码

    通过对Hibernate 3.2源码的阅读和分析,开发者可以深入理解其内部机制,学习如何优化数据访问,如何处理复杂的关联关系,以及如何实现更高效的缓存策略。这对于提升Java企业级应用的开发能力具有极大的价值。

    hibernate_reference

    这些配置属性包括SQL方言、外连接抓取、二进制流、二级和查询缓存、查询语言替代、Hibernate统计信息和日志系统。此外,文档还提供了如何实现命名策略和持久化类提供者的指导。文档最后提及了Hibernate的XML配置文件...

    hibernate3.2 开发API+源码参考

    同时,分析源码可以帮助你理解Hibernate的工作机制,比如对象状态管理、查询优化和事务处理。结合实例代码,你可以在实践中巩固理论知识,提高解决问题的能力。 总之,这个压缩包提供了一个全面学习Hibernate 3.2的...

    深入浅出Hibernate(含源码)

    《深入浅出Hibernate》是由夏昕编著的一本关于Hibernate框架的专业书籍,旨在帮助读者全面理解和掌握Hibernate这一Java领域中的主流持久化框架。Hibernate作为对象关系映射(ORM)工具,能够将Java对象与数据库表...

Global site tag (gtag.js) - Google Analytics