Mybatis-缓存简单讲解

Mybatis缓存

本文,记录Mybatis缓存使用及原理

一级缓存
一级缓存是SqlSession级别的,默认开启,一个SqlSession,有一个一级缓存,各个SqlSession直接缓存不共享
SqlSession一级缓存使用
  1. 缓存keystatmentId,params,boundSql,rowwBounds+environmentId
  2. 查询数据,SqlSession计算出key,从BaseExecutor持有的HashMap中查找是否有结果,如果有则返回,如果没有进行下一步
  3. SqlSession查询数据库,计算出key,存储到SqlSession持有BaseExecutorHashMap中,返回结果
  4. 第二次查询,走第一步
一级缓存失效
  1. 由于不同SqlSession缓存不共享,如果跨SqlSession,缓存是失败的;
  2. 当Mybatis执行了Insert,Update,Delete,会将缓存全部clear;
  3. 手动commit,rollback,会将缓存全部clear;
  4. 当指定LocalCacheScope级别是STATEMENT的时候,不保存SqlSession缓存;
  5. SqlSession是非线程安全的,对于临界状态的代码,需要手动保持线程安全;
注意
  1. 不要对Mybatis返回对象做任何修改:由于一级缓存的存在,Mybatis返回数据是缓存数据的引用,如果修改对象,会将缓存数据一起修改;
二级缓存

二级缓存,是Mapper级别的,需要手动开启,可以跨SqlSession读取,由于二级缓存可以自定义实现存储介质多样,需要将polo类实现序列化接口

二级缓存查询流程:
二级缓存执行流程1
二级缓存执行流程2

二级缓存存储流程:

  1. 当声明使用二级缓存时,Mybatis将使用CachingExecutor作为执行器,他持有的TransactionalCacheManager来做二级缓存管理,当TransactionalCacheManager调用commit的时候会将数据存入二级缓存,而CachingExecutorclose,commit的时候会调用TransactionalCacheManager.commit(),然后SqlSessioncommit,close实际就是调用Executorcommit,close,所以只有当SqlSession调用commit,close时,才会存入二级缓存;
  2. TransactionalCacheManager中持有TransactionalCache,每一个事物会有一个缓存,当查询时,如果没有缓存,会从数据库中查询数据,并放入TransactionalCache持有的entriesToAddOnCommit中,当commit时,批量从entriesToAddOnCommit刷入二级缓存
二级缓存使用
  1. 配置文件指定开启二级缓存
  2. Mapper添加二级缓存开启配置
    • 注解:@CacheNamespace
    • XML:<cache/>
    • SQL级别指定是否使用缓存,刷新缓存
      • useCache=“false”:是否使用缓存
      • flushCache:当执行insert,update,delete是否删除缓存,默认ture
      • 注解使用@Options进行配饰
  3. 缓存对象实现序列化接口
注意
  1. 保证单表缓存必须在一个namespace下【只有单表操作上使用缓存】否则会导致数据脏读
  2. 确保,select操作远大于insert,update,delete时使用
使用Redis实现二级缓存

使用Redis作为二级缓存,可以实现分布式缓存

  1. 指定缓存实现
    • <cache type=“org.mybatis.caches.redis.RedisCache” />
    • @CacheNamespace(implementation = RedisCache.class)
  2. 添加Redis配置文件redis.properties
    host=192.168.1.105
    port=6379
    connectionTimeout=5000
    password=
    database=0
    
  3. 使用缓存
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值