美文网首页
Hibernate | 一二三级缓存详解

Hibernate | 一二三级缓存详解

作者: cengel | 来源:发表于2018-09-17 10:07 被阅读0次

    Hibernate缓存简介和对比、一级缓存、二级缓存详解
    hibernate缓存机制

    1.缓存类型:

    1.1 事务范围(单Session即一级缓存) 基于线程

    事务缓存只能被当前事务缓存,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式。缓存的生命周期依赖于事务的生命周期。事务缓存使用==内存==做存储介质

    1.2. 应用缓存(单SessionFactory即二级缓存) ,基于进程的缓存

    应用程序的缓存,可以被应用程序内所有事务共享。缓存的生命周期依赖于应用的生命周期。应用级别的缓存可以使用==内存或硬盘==做存储介质。

    1.3. 集群范围(多SessionFactory即三级缓存)

    在集群环境中,缓存被一个或多个机器的进程共享,缓存数据被复制到集群的每个进程节点下。进程间通过远程通信来保证缓存中的数据一致,缓存数据通常采用对象的松散数据形式

    2 缓存机制

    2.0 简易示例

    //本行是二级缓存,如果二级缓存有数据,则从缓存取,没有则查询数据库
    DotaHero dotaHero = hibernateTemplate.execute(session -> (DotaHero) session.createSQLQuery("select * from dota_hero where id = 1 ").addEntity(DotaHero.class).setCacheable(true).setCacheMode(CacheMode.GET).uniqueResult());
    //本行不会查询数据库使用一级缓存(session级别的缓存)
    dotaHero = dotaHeroService.get(1);
    dotaHero = dotaHeroService.get(1); //如上不会查询数据库
    
    ===> 控制台打印
    Hibernate: 
        select
            dotahero0_.ID as ID1_0_0_, //(说明存在二级缓存)
            ...
        from
            DOTA_HERO dotahero0_ 
        where
            dotahero0_.ID=?
            
    sql只执行了一次
    

    2.1 一级缓存

    hibernate(二)一级缓存和三种状态解析

    2.2 二级缓存

    hibernate(九) 二级缓存和事务级别详讲

    2.1 cacheMode 缓存模式
    • CacheMode.NORMAL - 从二级缓存中读、写数据。
    • CacheMode.GET - 从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。
    • CacheMode.PUT - 仅向二级缓存写数据,但不从二级缓存中读数据。
    • CacheMode.REFRESH - 仅向二级缓存写数据,但不从二级缓存中读数据。

    相关文章

      网友评论

          本文标题:Hibernate | 一二三级缓存详解

          本文链接:https://www.haomeiwen.com/subject/fwcknftx.html