Mybatis缓存详细的深入了解
1.SSM项目中如何打开Mybatis的SQL语句打印
1.1 配置mybatis-config.xml
<?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="logImpl" value="STDOUT_LOGGING" />
</settings>
</configuration>
1.2 在spring配置文件中添加mybatis的配置文件路径
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:school/*.xml"/>
</bean>
2.SpringBoot项目中如何打开Mybatis的SQL语句打印
logging:
level:
com.example.demo.dao : debug
3.Mybatis的一级缓存(默认情况下都处于开启状态)
@Test
public void test14(){
System.out.println("第一次");
studentService.selectByNameDim("大").forEach(System.out::print);
System.out.println("第二次");
studentService.selectByNameDim("大").forEach(System.out::print);
}
可上面的代码打印了两次SQL查询语句,是一级缓存失效了吗,不是,原因如下
mybatis的一级缓存生效的范围是sqlsession,是为了在sqlsession没有关闭时,业务需要重复查询相同数据使用的。一旦sqlsession关闭,则由这个sqlsession缓存的数据将会被清空,同一线程里面两次查询同一数据所使用的sqlsession是不相同的,所以,给人的印象就是结合spring后,mybatis的一级缓存失效了。
所以mybatis与spring整合后,因为每次都进行创建新的sqlsession,所以就用不上sqlSession的缓存了.
4.Mybatis的二级缓存(二级缓存默认是不开启的,需要手动开启二级缓存,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的)
4.1修改mapper的xml文件
<cache eviction="LRU" readOnly="true" size="1024" />
4.2 体验测试Mybatis二级缓存
@Test
public void test14(){
System.out.println("第一次");
studentService.selectByNameDim("大").forEach(System.out::print);
System.out.println("");
System.out.println("第二次");
studentService.selectByNameDim("大").forEach(System.out::print);
}
可以看到第二次查询并没有去数据库查询,而是在二级缓存中命中了,命中率为0.5
5.总结
当二级缓存开启后,同一个命名空间(namespace) 所有的操作语句,都影响着一个共同的 cache,也就是二级缓存被多个 SqlSession 共享,是一个全局的变量。当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。一级缓存和二级缓存都很相似,只是作用域不一样,一级缓存是SqlSession ,二级缓存是同一个命名空间(namespace),而他们中间只要有插入删除更新操作将会清除缓存全部。