mybatis 面试:一级缓存和二级缓存

前言

mybatis 现在是面试必问的,其中最主要的除了一些启动流程,基础语法,那么就是缓存问题了,在面试中也是常问的问题之一;

大家都知道mybatis是有二级缓存的,
其中一级缓存默认是开启的,二级缓存是要手动配置开启的,
但是本人这里不建议在实际生产中用mybatis的缓存,还是建议在外部实现自己的缓存,如使用redis等;

一级缓存

1:一级缓存是默认开启的;
2:底层其实是基于hashmap的本地内存缓存;
3:作用域是session(其实就相当于一个方法);
4:当session关闭或者刷新的时候缓存清空;
5:不通sqlsession之间缓存互不影响;

问题一:其实一级缓存也有数据一致性问题:
比如:我有一个更新操作对同一条数据,
如果是sqlsessionA进行了更新操作,则sqlsessionA对应的一级缓存被清空;
如果是sqlsessionB进行了更新操作,则此更新操作对改sqlsessionA不可见;
那么其实这个时候sqlsessionA再查的数据就是过期失效数据了;
就出现了数据不一致现象;

建议
1:单个sqlsession的生命周期不能过长;
2:如果是对同一个语句更新尽量使用同一个sql,也就是同一个sqlsession;
3:建议关闭一级缓存,
怎么关闭呢?
在mybatis的全局配置文件中增加


二级缓存

1:首先mybatis默认是没有开启二级缓存的,
2:二级缓存需要我们手动开启,它是mapper级别的缓存;
3:同一个namespace下的所有操作语句,都影响着同一个Cache,即二级缓存被多个SqlSession共享,是一个全局的变量。

那怎么开启二级缓存呢?


使用二级缓存?

在标签下面添加

使用二级缓存的pojo类实现序列化接口;

当然二级缓存也不建议使用,mysql都默认关闭了,更何况我们呢;

因为二级缓存是建立在同一个namespace下的,如果对某一个表的操作查询可能有多个namespace,那么得到的数据就是有问题的;

建议:
1:对某个表的操作和查询都写在同一个namespace下,其他的namespace如果有操作就会有问题,脏数据;
2:对表的关联查询,关联的所有表的操作都必须在同一个namespace下;(这点在实际生产中简直太垃圾了,怎么可能呢)

总结

建议统一使用第三方插件来做缓存,如redis,mamcache等,
关闭mybatis的一级缓存和二级缓存,
mybatis仅仅只限于orm框架,数据库和对象的映射,以及操作sql;

你可能感兴趣的:(面试整理,Mybatis)