2.1 Mybatis的缓存
2.1.1 缓存
很多时候用户发送请求后都需要去查询数据库,如果数据有成千上万条,每次请求都来查询数据库会极大增大系统开销,严重时会导致系统崩溃瘫痪无法运行,这个时候可以利用缓存的思想,将查询到的信息存储进内存中作为临时数据,这样下一次请求只需要从内存中读取,极大降低了系统开销,同时减轻和数据库的交互次数,提高系统效率,提高查询效率,解决了高并发系统的性能问题
适合存放进缓存中的数据:需要经常查询且不改变的数据
2.1.2 Mybatis的一级缓存
Mybatis默认情况下会开启一级缓存,既SqlSession级别的缓存,一般从获取连接到关闭连接才会清除缓存
例如如下测试方法:查询两次相同的数据只执行了一次sql语句,即第二次查询从缓存中查询,不再与数据库进行交互
/**
* 测试通过id查询某个人的方法
*/
@Test
public void FindUserByIdTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user1 = mapper.findUserById(41);
//查询相同的数据
System.out.println(user1);
System.out.println("==========================");
User user2 = mapper.findUserById(41);
System.out.println(user2);
sqlSession.close();
}
一级缓存失效的几种情况:
-
查询不同的数据
-
调用了不同的SqlSession
-
进行了增删改的操作,因为缓存需要同步数据库,每次改变数据都需要重新缓存
-
调用方法手动关闭缓存
SqlSession.clearCache();
2.1.3 Mybatis的二级缓存
二级缓存也叫全局缓存,是基于namespace的缓存
每次查询数据时(一次会话),会先将该数据存入一级缓存中
若会话关闭后,一级缓存失效,其数据会存入二级缓存中
新的会话查询该数据时,会直接从二级缓存获取内容
不同的mapper查出的数据会放在自己对应的缓存中
-
在主配置文件中开启全局缓存
<!--开启全局缓存,默认是开启的,为了增强代码的可读性-->
<setting name="cacheEnabled" value="true"
在相应需要使用二级缓存的mapper.xml文件中使用
<cache/>
这样就实现了开启二级缓存,可以进行代码的测试
2.1.4 缓存顺序
-
先查二级缓存
-
再查一级缓存
-
再查询数据库
2.1.4 自定义缓存(了解)
可到mybatis的官方文档了解