这个问题面试被问了好几次,还是研究下。
mybatis一级缓存是SqlSession级别的或是Statement级别的,关闭不了,默认是SqlSession级别,当使用一个SqlSession实例多次查询时,如果中间没有穿插增删改,则第二次及之后的查询都不会去查数据库,而是从缓存里面取。
一级缓存配置在mybatis的配置文件中,注意不是映射文件,是配置文件。配置的关键字是localCacheScope,值可以是session或statement。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="localCacheScope" value="statement"/>
</settings>
</configuration>
mybatis一级缓存可能会造成脏数据的情况。sqlSession1查完一次之后,把数据放到缓存中。这时sqlSession2更新了数据库数据,sqlSession1再次查询会直接从缓存里面取,而这时候数据实际上已经发生变化,所以会查出脏数据。
未搭配spring使用时,
SSM或者spring boot时,要用@Transactional注解标注方法,多次查询才会共用一个SqlSession实例,否则每次查询都会生成一个新的SqlSession实例。
二级缓存
二级缓存不建议用,用总开关关闭即可,默认也是开。也是在mybatis配置文件中配置,配置关键字是cacheEnabled,值可以是true或false,默认是true。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="false"/>
</settings>
</configuration>