Mybatis-面试题*补全中
Mybatis 的缓存
Mybatis中 有一级缓存 与二级缓存
- 一级缓存的作用域是在一个sqlSession中,当一个sqlSession结束后该sqlSession的缓存也就不存在了,默认是开启的
缺点: 作用域小 命中率极低 - 二级缓存的作用域是针对一个mapper进行缓存的默认也是开启的 需要在mapper的xml文件中添加标签才会使用到 二级缓存;
二级缓存默认的实现类是 org.apache.ibatis.cache.impl.PerpetualCache 默认实现是是(HashMap)本地缓存不支持分布式缓存,在分布式服务的情况下开启二级缓存会出现脏读的情况;
Mybatis缓存的查询顺序
二级缓存->一级缓存 -> 数据库
Mybatis 的一/二级缓存在集群部署的方式中会存在那些问题以及怎么解决
在集群部署中使用一级/二级缓存 会发生脏读的情况;
拿二级缓存来说 服务部署多个节点 节点A,节点B,节点C三个阶段开启二级缓存,缓除是在非查询的操作中才会进行清除,当节点A 进行数据操作 清除缓存只是清除了节点A的缓存 节点B、C都是没有清除的 这个时候 B、C 执行查询操作还是会查到缓存的数据,会出现脏读的情况;
如何解决呢:可以使用redis替代二级缓存有两种方式,
一种是mybatis支持自定义缓存 实现Cache接口就可以
<cache type="自定义的缓存类"/>
第二种是 依赖 mybatis-redis 配置
<cache type="org.mybatis.caches.redis.RedisCache"/>