mybatis一级缓存与二级缓存

亡梦爱人 提交于 2019-12-07 23:20:31

一级缓存:默认开启

  1. MyBatis一级缓存的生命周期和SqlSession一致。
  2. MyBatis一级缓存内部设计简单,只是一个没有容量限定的HashMap,在缓存的功能性上有所欠缺。
  3. MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,
  4. 脏数据原因:在一个sqlSession中执行几个查询操作,但在这些查询操作中间另一个sqlSession去更新了数据库,而这次的更新第一个sqlSession是无感知的,此时它再去查询依然是在缓存中查询
  5. 使用mybatis-spring时一级缓存失效(原因没弄懂)

 

二级缓存:默认关闭

      生命周期为namespace

  开启二级缓存的步骤:一开启全局缓存(setting中 默认开启)

            二在对应的mapper.xml中开启

  当sqlSession没有关闭时或者提交时,这次查询的数据不会缓存到二级缓存

  1. MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强。
  2. MyBatis在多表查询时,极大可能会出现脏数据(一个namespace中的缓存变化对另一个namespace是无感知的),有设计上的缺陷,安全使用二级缓存的条件比较苛刻。
  3. 在分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,需要使用集中式缓存将MyBatis的Cache接口实现,有一定的开发成本,直接使用Redis、Memcached等分布式缓存可能成本更低,安全性也更高

总结:

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!