mybatis-plus缓存应用

备注:

以下是一二级缓存建议关闭的配置:

mybatis-plus:
  mapper-locations: classpath*:mapper/*Mapper.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.fp.chargeoperation.domain
  configuration:
     map-underscore-to-camel-case: true
    cacheEnabled: false
    localCacheScope: STATEMENT

一.一级缓存

1.使用及配置

  A:当带有相同的执行SQL在同一个会话session里面执行时,不再查询DB,而是直接查询缓存

 

Yml文件追加:

mybatis-plus:

  configuration:

     localCacheScope: SESSION

建议关闭设置:localCacheScope: STATEMENT

2.一级缓存(会话级别)的命中条件

mybatis-plus默认是开启状态

A. 相同的SQL语句和参数

B.会话级别缓存,必须是相同的会话

      在CachingExecutor源码里面的CacheKey包含了会话ID,如果不是同一个会话则不会被命中 
C.必须是调用相同的mapper方法

D.必须是相同的命名空间(namespace:mapper)

    因为在mybatis的CachingExecutor源码里面CacheKey( 缓存的key) 包含了命名空间+方法ID+ sql组合而成

     public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {

            BoundSql boundSql = ms.getBoundSql(parameterObject);

            CacheKey key = this.createCacheKey(ms, parameterObject, rowBounds, boundSql);

            return this.query(ms, parameterObject, rowBounds, resultHandler, key,boundSql);

     }

E.会话执行期间不能执行update,del,insert 写操作

    只要执行了写操作,当前进程的全部会话缓存都会被清空。

F.在会话期间SQL执行中不能追加flush操作

 

二. 一级缓存的处理流程

A:客户端调用,Cache

B:动态代理,MapperMethod -aMappperProxyaProxy

C:会话调用,DefaultSqlSession

D:拼装缓存key,CachingExecutor

E:判断是否存在二级缓存:CachingExecutor

F:执行一级缓存(是否清空,判断缓存)BaseExecutor

G:   获取一级缓存数据:PerpetualCache

 

三.二级缓存的使用背景

1. 字典表静态数据

    这样的数据很稳定,虽然可以放到一级缓存中,但如果client发起多次会话请求时仍然会查询数据库。

   即两个不同的会话虽然查询SQL都是一样的,但不能够命中缓存,因为会话不同。

   Query的请求顺序是先二级缓存—>一级缓存-->数据库

  mybatis-plus 的二级缓存默认开启的,需要手动关闭。但即便不关闭没有配置xml的cache你的查询也不会命中

  二级缓存是在不同会话之间使用的,与一级缓存的相同会话互补。

 

2.使用方法

A:Yml文件配置:

mybatis-plus:

     configuration:

        cacheEnabled: true

B:在需要使用缓存查询的mapper文件中追加缓存引用的配置

<cache eviction="FIFO"   flushInterval="10800000"  size="1024" readOnly="true"  />

   Eviction:回收策略(FIFO,LRU ,SOFT )

   flushInterval:刷新间隔

   readOnly:

   size:可用内存资源数目

   readOnly:只读的缓存会给所有调用者返回缓存对象的相同实例, 可读写的缓存会返回缓存对象的拷贝 ,默认是false。

3.二级缓存的使用条件

A. 不同的会话,且只有当上一会话的session提交或者关闭之后才会生效。

      意思是指前一个会话在提交或关闭之后才会把信息写入缓存,如果在前一个会话关闭之前另一个会话来查询则不会命中缓存。
B.必须是调用相同的mapper方法

C.必须是相同的命名空间(namespace:mapper)

D.会话执行期间不能执行update,del,insert 写操作

E.在SQL执行中不能追加flush标签

 

备注:

一级缓存即便开启,在进程中的命中概率也很低

二级缓存除了配置开启开关还需修改xml文件

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值