mybatis 缓存失效和坑

mybatis 缓存失效和坑

mybatis 缓存类型

  1. local cache,也就是所谓的局部缓存。由以下参数控制:

    • localCacheScope 文档
  2. cache,也就是所谓的二级缓存。由以下参数控制:

    • cacheEnabled
    • cache
    • cache-ref
    • useCache
    • flushCache

spring 接管后的一级缓存失效问题

分为两种情况,如果没有开启事务,每一次sql都是用的新的SqlSession,这时mybatis的一级缓存是失效的。
如果有事务,同一个事务中相同的查询使用的相同的SqlSessioon,此时一级缓存是生效的。
如何判断是否是同一个SqlSession 可以把日志级别降到debug级别查看相应的SqlSessionId

[Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@13714753]]

一级缓存的坑

  1. 同一个事务中在查询中间如果有其他线程修改了这条数据,这两条两次查询的还是内容相同(事务使用的是Read Committed)
    原因是同一个事务中spring使用的是同一个SqlSession,此时走的是SqlSession的缓存,并没有从数据中查询。
  2. 网上的其他问题

如何解决一级缓存的坑

  • 在mybatis配置文件中localCacheScope=statement。

  • 在mapper配置文件中,给select设置flushCache=true。需要注意的是,这样会将local cache和 cache都清空掉。

  • 不用事务

相关的一些博客

  • 参考1
  • 参考2
  • 参考3

你可能感兴趣的:(mybatis 缓存失效和坑)