首页 > 其他 > 详细

Mybatis的一级缓存和二级缓存

时间:2021-04-04 23:19:12      阅读:35      评论:0      收藏:0      [点我收藏+]

一级缓存

特性:

  1. 默认就开启了,也可以关闭一级缓存 localCacheScope=STATEMENT

  2. 作用域:是基于sqlSession(默认),一次数据库操作会话。

  3. 缓存默认实现类PerpetualCache ,使用map进行存储的

  4. 查询完就会进行存储

  5. 先从二级缓存中获取,再从一级缓存中获取

    key==> sqlid+sql

失效情况:

  1. 不同的sqlSession会使一级缓存失效

  2. 同一个SqlSession,但是查询语句不一样

    1. 同一个SqlSession,查询语句一样,期间执行增删改操作
    2. 同一个SqlSession,查询语句一样,执行手动清除缓存

二级缓存

特性:

  1. 默认开启了,没有实现

  2. 作用域:基于全局范围,应用级别。

  3. 缓存默认实现类PerpetualCache ,使用map进行存储的但是二级缓存根据不同的mapper命名空间多包了一层

    map : org.apache.ibatis.session.Configuration#caches key:mapper命名空间 value:erpetualCache.map

    key==> sqlid+sql

  4. 事务提交的时候(sqlSession关闭)

  5. 先从二级缓存中获取,再从一级缓存中获取

实现:

  1. 开启二级缓存
  2. 在需要使用到二级缓存的映射文件中加入,基于Mapper映射文件来实现缓存的,基于Mapper映射文件的命名空间来存储的
  3. 在需要使用到二级缓存的javaBean中实现序列化接口implements Serializable
    配置成功就会出现缓存命中率 同一个sqlId: 从缓存中拿出的次数/查询总次数

失效:

  1. 同一个命名空间进行了增删改的操作,会导致二级缓存失效
  2. 但是如果不想失效:可以将SQL的flushCache 这是为false,但是要慎重设置,因为会造成数据脏读问题,除非你能保证查询的数据永远不会执行增删改
  3. 让查询不缓存数据到二级缓存中useCache="false"
  4. 如果希望其他mapper映射文件的命名空间执行了增删改清空另外的命名空间就可以设置:

Mybatis的一级缓存和二级缓存

原文:https://www.cnblogs.com/jqccan/p/14616656.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!