`
newleague
  • 浏览: 1509473 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

Hibernate二级缓存与查询缓存问题

阅读更多

http://www.sunxin.org/forum/thread/22597.html?page=1
由于对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一级缓存、二级缓存和查询缓存

    **hibernate一级缓存、二级缓存和查询缓存** 在Java的持久化框架Hibernate中,缓存机制是提高应用程序性能的关键要素。缓存能够减少数据库的访问次数,提高数据读取速度,并且在一定程度上降低了系统的负载。本文将...

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

    二级缓存可以通过设置不同的并发访问策略来解决并发问题,如事务型、读写型或非严格读写型,以适应不同场景下的需求。 持久化层的缓存范围决定了缓存的生命周期和访问权限。事务范围的缓存最安全,但只限于当前事务...

    Hibernate二级缓存

    Hibernate二级缓存是一种提高应用程序性能的技术,它将数据存储在SessionFactory级别的缓存中,使得数据可以在不同的Session之间共享。这与一级缓存(Session级别)不同,一级缓存仅存在于单个Session生命周期内,当...

    hibernate二级缓存实例

    总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...

    hibernate 二级缓存详解

    Hibernate 二级缓存是针对SessionFactory级别的全局缓存,与一级缓存(Session级别)不同,一级缓存只在单个Session生命周期内有效。二级缓存则允许不同Session之间共享数据,提高了数据访问效率,减少了对数据库的...

    Hibernate一级缓存、二级缓存以及查询缓存实例

    本文将深入探讨Hibernate的一级缓存、二级缓存以及查询缓存,通过具体的实例来阐述它们的工作原理和使用方法。 首先,我们从一级缓存开始。一级缓存是Hibernate默认提供的缓存,它是每个Session级别的,也被称为...

    hibernate二级缓存示例源码

    **hibernate二级缓存详解** Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,在处理大量数据时,性能优化显得尤为重要,这就是二级缓存的作用。本文将深入探讨Hibernate...

    hibernate二级缓存包

    Hibernate二级缓存是Java开发中使用Hibernate框架进行数据持久化时优化性能的一种重要技术。它在一级缓存(Session级别的缓存)的基础上,提供了一个全局的、跨会话的数据存储层,可以显著减少对数据库的访问,从而...

    day37 05-HIbernate二级缓存:一级缓存更新同步到二级缓存及二级缓存配置文件

    本篇文章将深入探讨Hibernate的二级缓存机制,以及如何进行一级缓存与二级缓存的同步,同时还会介绍二级缓存的配置文件设置。 一级缓存是Hibernate默认提供的缓存,每个SessionFactory实例都有一个一级缓存。当对象...

    Hibernate一级缓存和二级缓存

    **二、Hibernate二级缓存** 二级缓存是SessionFactory级别的,跨越了多个Session,可以被多个线程共享。它通常由第三方插件如EhCache、Infinispan等提供。二级缓存分为以下几种类型: 1. **集合缓存**:用于存储...

    Hibernate 二级缓存

    Hibernate 二级缓存

    hibernate二级缓存java包下载

    1. **一级缓存与二级缓存的区别**: - 一级缓存:每个 Hibernate Session 对象都有一个一级缓存,它是默认开启的。当对象被加载到 Session 中,它们会被存储在一级缓存中,直到 Session 被关闭。一级缓存是事务范围...

    Hibernate 二级缓存 总结整理

    通过理解和运用Hibernate的二级缓存,我们可以优化应用性能,减少数据库压力,但同时也需要注意缓存可能带来的问题,如数据一致性、内存管理和并发控制等。在实际项目中,结合业务需求和系统特点,合理配置和管理...

    hibernate一级和二级缓存配置与详解

    本篇将深入探讨Hibernate的一级缓存和二级缓存,以及查询缓存的配置和使用。 ### 一级缓存 一级缓存是Hibernate默认提供的缓存,它是Session级别的,每个Hibernate Session都有一个私有的、本地的一级缓存。当我们...

    hibernate开启二级缓存和查询缓存

    在 Hibernate 中,二级缓存和查询缓存是提高应用性能的重要机制。下面将详细介绍如何开启并理解这两个缓存机制。 ### 1. 一级缓存与二级缓存 #### 1.1 一级缓存 一级缓存是 Hibernate 内置的 Session 缓存,它是每...

    Spring集成的Hibernate配置二级缓存

    以EhCache为例,我们需要在项目中引入ehcache-core或ehcache的依赖,并在Hibernate配置文件(hibernate.cfg.xml或persistence.xml)中启用二级缓存,添加如下配置: ```xml &lt;property name="hibernate.cache.use_...

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    通过以上步骤,我们就成功地在Spring Boot 2.1.4.RELEASE项目中配置了使用Redis作为Hibernate二级缓存的环境。这将显著提升数据库查询效率,减少对数据库的压力,尤其在高并发场景下,效果尤为明显。记得在实际生产...

    为Spring集成的Hibernate配置二级缓存

    二级缓存的使用可以显著提升系统性能,特别是在频繁查询相同数据的情况下。然而,需要注意的是,虽然缓存可以提高效率,但也要考虑数据的一致性和并发控制问题,避免出现脏读、不可重复读等问题。因此,在实际应用中...

    hibernate 二级缓存

    本篇文章将深入探讨Hibernate二级缓存的概念、工作原理以及如何在实际项目中设置和使用。 **一、二级缓存概念** 一级缓存是每个Hibernate Session内部的一个内存区域,用于存储Session期间的操作对象。当Session...

Global site tag (gtag.js) - Google Analytics