1、一级缓存
条件:同一个的sqlsession中;默认开启;执行相同语句;中间无数据库update操作;如图为不同sqlsession,一级缓存失效
清除缓存,通过sqlsession.clearCache();
中间进行删除,一级缓存失效,重新开始缓存
2、二级缓存
默认不开启;
在mapper.xml配置文件中加入<Cache></Cache>标签开启
范围为不同的sqlsession,1:当一级缓存关闭时,可以执行二级缓存;
:2: 当一级缓存执行增删改时,一级缓存关闭,如果添加<Cache></Cache>标签,则数据也会被加载到二级缓存中
相关属性:flushCache:默认为true,在select,delete,insert标签中都有,不写默认为true,清空一级、二级缓存;false则不清空
注意!!!
如果数据存放类没有实现serialize接口,会报错
解决方法:
结果:
3、mybatis自身缓存缺陷
因为delete、等标签自身的flushCache为true,如果不为true,为flase,则下一次查询,缓存中的数据不变,和数据库中数据不匹配,出错;如果为true,则将一级、二级缓存都彻底清除,下次查询得重新查询,大大消耗运行时间和内存,所以,一般不用mybatis自身的缓存,用别的框架:
比如 Redis、ehcache等,它们优点是支持特定条数删除,修改等,不重新加载别的数据
两次删除修改等,在当前缓存修改一次,对数据库操作也修改一次