springboot下mybatis一级缓存是默认开启的,且缓存级别为session(一个sqlsession有一个缓存)。二级缓存需要在mapper文件加cache标签。
首先,
在事务期间,执行的所有mapper方法共用一个sqlsession。
在非事务期间,每执行一个mapper方法都会单独创建一个sqlsession。
那这个一级缓存我理解一般是用不上的。
如果没有事务,每个mapper方法都对应一个新的sqlsession,这种情况自然用不上。
如果有事务,由于事务隔离(mysql默认隔离级别:可重复读,如果是更低的隔离级别,mybatis一级缓存会出现脏数据,即和DB不一致),除非自己修改,那么前后两次相同的查询结果一定一样,这种情况下,事务中一般也不会出现前后两次做相同查询,如果需要直接使用第一次查询的结果就好了。
还有,在事务期间,如果使用mybatis一级缓存,就一定小心不能修改mybatis mapper方法的返回值,因为mybatis一级缓存直接缓存的就是mapper方法的返回值,没有深拷贝,所以,如果有修改,后续相同查询拿到的都是修改后的脏数据。
对于二级缓存,同样需要注意这个问题。
使用二级缓存需要慎重,很容易产生脏数据:
情况一:mapper中有从多个表查询的操作。
情况二:应用分布式部署。
所以,一般情况下不建议使用mybatis的缓存。









网友评论