mybatis的缓存分为一级缓存和二级缓存
一级缓存针对的是sqlSession,默认是开启状态。
问题一:什么情况下,执行同样的sql查询语句只会执行一次。
同一个sqlSession,执行查询的sql语句时,第一会执行查出数据,从二次查询开始,你会发现查询出的语句都是在缓存中取出。但是在你执行了一次更新、或者删除、插入语句提交后,缓存会清除。这时候你在执行这个查询会重新读取 一遍数据,重新存入本地缓存。
问题二:什么情况下,执行同样的sql查询语句会重复次执行呢。
不同的sqlSession,执行同样的Sql查询语句,这时候每一次的查询都会执行。
二级缓存针对的是Mapper,而mapper级别是贯穿了全部的的sqlSession。如下图
二级缓存是默认关闭的,不同的sqlsession同时调用了开启了二级缓存配置的mapper,这时候查询的sql语句的操作都只会执行一次,接下来介绍一下开启的方式:
1.配置的方式:
注:settings 元素在 configuration 标签元素中书写顺序排在第二位
在configuration.xml文件中配置开启:
<settings> <setting name="cacheEnabled" value="true"/> </settings>
在要开启缓存的Mapper.xml中配置:
<cache readOnly="true"/>
这样调用这个mapper的查询语句的时候缓存就开启啦。
2.自动控制二级缓存的开启:
@Autowired
private SqlSession sqlSession;
@PostConstruct
private void init() {
sqlSession.getConfiguration().setCacheEnabled(false);
}
@RequestMapping(value = "/setCacheState")
@ResponseStatus(HttpStatus.OK)
public void setCacheState(boolean ic) {
sqlSession.getConfiguration().setCacheEnabled(ic);
}
@RequestMapping(value = "/getCacheState")
public Object getCacheState() {
return Collections.singletonMap("cacheState", sqlSession.getConfiguration().isCacheEnabled());
}
以上是mybatis的缓存介绍,接下来介绍一下新架构中如何清除IE下的缓存:
1.在请求后面加上随机数,这边用的是时间。
axios.get('/messageManage/setIsReadMsg?t=' + Date.now(),{params}).then(res=>res.data);
2.在路由配置:
app.config(['$httpProvider', function($httpProvider) {
if (!$httpProvider.defaults.headers.get) {
$httpProvider.defaults.headers.get = {};
}
$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);