`
bluenemo
  • 浏览: 179077 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[转载]Hibernate二级缓存与查询缓存的组合探究

阅读更多

0. 前言

         由于对Hibernate 的二级缓存和查询缓存的区别不了解,也不知道它们起什么作用。于是动手做了一些实验,对它们的组合使用有了一个表面的认识。

1. 前提

         1) 不使用一级缓存(Session 级别)的情况。因为大部分api session 的操作都进行n 层封装,用完session close ,一般很少使用到一级缓存。

         2) 开启hibernate.show_sql=true ,根据sql 的是否输出来判断是否访问了数据库。

2. 基础

2.1. 二级缓存

         二级缓存是SessionFactory 级别的全局缓存,它为每个类(或集合)提供缓存。凡是调用二级缓存的查询方法都会从中受益,比如load,list,iterate 等方法(注意,get find 不使用缓存,直接访问数据库)。

         开启条件:

         1)hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider (这里指定了ehcache

         2)hbm.xml 配置<cache usage="read-write"/>

         3)ehcache.xml 定义该类的cache

         简单地说,二级缓存是用来保存类对象的,并且填充它的所有属性值。

2.2. 查询缓存

         查询缓存保存的是查询方法(list iterate 等)查询的sql 语句和结果集,跟load 这种装载对象的方法没有关系。也就是说,使用load 方法,查询缓存不理睬。

         并且这个结果集只是对象id 列表,对象的其他属性值不保存。例如,list 执行的时候,先根据查询缓存中的sql 语句,获取对象id 列表,然后再load(id) 来取对象。

         开启条件:

         1) hibernate.cache.use_query_cache=true

         2)Query 或者Criteria 使用时,设置setCacheable(true)

         简单地说,查询缓存是用来保存sql 执行后获取的对象id 列表。下一次执行同一条sql 时,可直接从查询缓存中获取到对象id 列表。

3. 实验

         以下对最常用的load list 方法进行二级缓存和查询缓存的组合测试。load list 执行的结果,都是返回同一个对象。

3.1. 四种组合

         二级缓存和查询缓存的组合,根据开启和不开启两种情况,划分为四种组合(√代表开启,×代表不开启):

        

组合

二级缓存

查询缓存

1

×

2

×

3

4

×

×

3.2.load 实验

         对同一个id ,使用load 执行两次,观察sql 的输出现象,也就是判断第二次load 是否访问了数据库。其中√代表输出,×代表未输出:

 

组合

第一次sql

第二次sql

结论

1

×

与查询缓存无关

2

3

×

4

 

         当开启了二级缓存,load 先从缓存中获取对象,于是组合1 3 的第二次sql 都未输出,即第二次查询没有访问数据库。

         当没有开启二级缓存,load 总是直接访问数据库的。也证明了,查询缓存与load 方法无关。

3.3.list 实验

         对同一条sql 语句,使用list 执行两次,观察sql 的输出现象。其中√代表输出,×代表未输出:

 

组合

第一次sql

第二次sql

结论

1

list 每次访问数据库都会填充二级缓存,相当于二级缓存无效

2

√(不一样)

这两条sql 语句不一样,第一条是list 的,第二条是load

3

×

 

4

 

 

         对组合1 现象的解释:

         当没有开启查询缓存时,list 每次都会直接访问数据库,然后把二级缓存给重新填充。也就是说, list 在不开启查询缓存的情况下,根本就没有利用到二级缓存的好处。

         对组合2 现象的解释:

         第一条sql list 正常访问数据库的,但第二次执行list 时,由于有了查询缓存,直接根据第一条sql 获取对象的id ,此时由于没有开启二级缓存,load(id) 后也没法从二级缓存中拿数据,只好再次访问数据库。但在组合3 中,load(id) 可以从二级缓存中拿数据,所以不用访问数据库。

3.4. 小结

         load list 方法中,使用二级缓存和查询缓存的不同组合,效果出现了差别。特别强调的是,由于很多操作是基于list 的,如果没有开启查询缓存,根本就使用不了二级缓存的数据,也就提高不了性能了(但是iterate 可以使用到二级缓存)。

         另外,从表格中可以看出来,同时开启二级缓存和查询缓存,效果是最好的,第二次查询都不需要访问数据库。

4. 维护

         当存在除hibernate 之外的改变数据库数据的方式时,维护二级缓存和查询缓存是很麻烦的。比如使用jdbc 或者第三方系统修改了数据库,hibernate 都不知道,也就没法自行维护缓存了。这时需要手动维护,如果存在第三方系统,还需要让第三方系统发消息通知hibernate

         维护手段也就是evict (清除某个类的二级缓存)和evictQuery (清除查询缓存)。针对数据修改的三种形式,分别维护:

         1)insert evictQuery

         2)delete evict evictQuery

         3)update evict

分享到:
评论

相关推荐

    Hibernate开发指南.rar

    二级缓存则是SessionFactory级别的,可跨Session共享,用于存储那些经常被访问但更新频率较低的数据。理解并正确配置缓存策略对于提升应用程序性能至关重要。 代码优化是Hibernate使用中的重要环节。这包括了合理的...

    孙卫琴hibernate sourcecode netstore源码

    Hibernate的二级缓存机制,如EHCache或Infinispan的集成,是提升系统性能的关键。 3. **事务处理**:在多线程环境下,NetStore如何确保数据的一致性和完整性,这涉及到Hibernate的事务管理策略和并发控制。 4. **...

    Hibernate源码

    4. **Caching机制**:分析二级缓存和查询缓存的工作原理,提高应用性能。 5. **懒加载和即时加载**:理解Hibernate如何通过代理对象实现懒加载,以及何时触发即时加载。 6. **关联映射**:探究一对一、一对多、多对...

    SSH之Hibernate总结

    优化包括缓存配置、批处理、延迟加载、二级缓存等策略,以提高Hibernate应用的性能和响应速度。 12. 补充话题 除了上述内容,还有更多高级特性如JPA支持、Hibernate Search、CGLIB动态代理等,可以进一步探索学习...

    Hibernate 源代码

    Hibernate提供了第二级缓存,用于缓存跨会话的对象。这可以提高性能,减少对数据库的访问。用户可以配置使用第三方缓存提供商,如Ehcache或Infinispan。 ### 7. 注解驱动的映射 在Hibernate 3.2之后,除了传统的...

    hibernate3.2 chm 帮助文档

    最后,探究更高级的主题,如性能调优、二级缓存和多表关联。 **五、实践应用** 理论学习的同时,结合实际项目进行实践是非常重要的。可以通过创建简单的CRUD应用来练习,逐步掌握Hibernate的使用。同时,了解如何在...

    hibernate-jpa学习

    - **二级缓存**:Hibernate的第二级缓存可以缓存整个实体,提高性能,但需谨慎使用,以防数据一致性问题。 - **多态(Polymorphism)**:JPA支持继承和多态,允许不同类型的实体共享相同的表。 通过上述知识点的...

    hibernate3.2源码

    5. **缓存机制**:Hibernate内置了二级缓存,可以通过实现CacheProvider接口自定义缓存策略,提高数据访问性能。 6. **事件和监听器**:Hibernate允许用户定义事件监听器,对对象的生命周期事件(如加载、保存、...

    精通 Hibernate 源码

    4. **缓存机制**:Hibernate支持第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的),了解它们的工作原理能帮助减少数据库访问,提高性能。 5. **事务管理**:Hibernate集成了JTA(Java Transaction...

    struts+hibernate+Spring面试题

    6. 缓存管理:Hibernate有第一级缓存(Session缓存)和第二级缓存(SessionFactory缓存),还支持第三方缓存(如EhCache)。 7. Hibernate优点:简化数据库操作,支持面向对象编程,提高开发效率,支持延迟加载,...

    hibernate学习笔记

    3. 缓存:一级缓存(Session级)、二级缓存(SessionFactory级)和查询缓存,提高系统性能。 4. 联合主键:多个字段共同组成主键,通过`@Embeddable`和`@EmbeddedId`注解实现。 5. 动态模型:无预先定义的实体类,...

    hibernate-orm-4.3.zip

    - 更强大的二级缓存支持,允许跨SessionFactory共享。 五、源码学习路径 对于想要深入研究Hibernate的开发者,可以从以下角度入手: 1. 阅读`SessionFactory`和`Session`的实现,理解其工作流程。 2. 分析`Entity`...

    HibernateStudy

    - 使用二级缓存提高性能,但要注意并发控制。 - 避免在循环中执行数据库操作,减少数据库交互次数。 - 正确管理事务,保证数据一致性。 8. **学习路径**: - 理解JPA规范和Hibernate框架的基本概念。 - 学习...

    JAVA自学之路 七路线图明细

    掌握实体属性映射,关联关系映射,Native SQL,inverse,lazy,cascade,继承关系映射,HQL,性能优化,一级缓存,二级缓存,查询缓存,事务管理,悲观锁和乐观锁,以及OpenSessionInView和CurrentSession。...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    认为应该针对那些最高级、最完善的浏览器来开发网站。而将那些被认为“过时”或有功能缺失的浏览器下的测试工作安排在开发周期的最后阶段 渐进增强 一开始只构建站点的最少特性,然后不断针对各浏览器追加功能。先让...

    Java面试宝典PDF

    2. JPA与Hibernate:了解ORM(对象关系映射)的概念,使用JPA规范和Hibernate实现。 3. 数据库事务:理解ACID属性,掌握事务的隔离级别和传播行为。 十、分布式系统 1. 分布式缓存:学习Redis和Memcached的使用,...

    官方源码 spring-framework-5.3.7.zip

    4. 数据访问:探究`JdbcTemplate`和`JpaTemplate`的实现,以及如何与ORM框架如Hibernate集成。 四、最佳实践 1. 使用`@Configuration`和`@ComponentScan`替代XML配置,提高代码可读性。 2. 声明式事务管理:利用`@...

Global site tag (gtag.js) - Google Analytics