什么是缓存?
缓存是存储数据的硬件或软件组件,以便将来可以提供更快
的数据请求;可以在缓存中找到请求的数据时,会发生缓存命中
,而当无法找到时,则会发生缓存丢失
。缓存命中是通过从缓存中读取数据来实现的,这比重新计算结果或从较慢的数据存储中读取数据要快;因此,缓存中提供的请求越多,系统执行得越快。
MyBatis缓存:
- MyBatis可以很方便地定制和配置缓存,极大地提高查询效率。
- MyBatis中有两个级别的缓存,
一级缓存
,二级缓存
。
(1)默认情况下,只有一级缓存是开启的(本地缓存,sqlsession级别
)
(2)二级缓存需要手动配置开启,是namespace级别
的。二级缓存可以通过Cache
接口定义二级缓存。
一级缓存:
- 默认开启,不能关闭,不用手动开启。
- 一级缓存又叫
本地缓存
,同一个sqlSession
查询到的数据会放在本地缓存中,如果后面的查询需要获取相同的数据,就从缓存中获取,不会再去查询数据库。 - select语句的结果会被保存到缓存中。
增删改
语句会刷新缓存
。- 最少使用的缓存会被清除,使用
LRU算法
清除。 - 查询不同的xml,会刷新缓存。
- 手动清理缓存
sqlSession.clearCache();
测试:
查询两次相同的记录,在日志中查看语句执行了几次。
@org.junit.Test
public void test1(){
SqlSession sqlSession=MyBatisUtils.getSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user1=userMapper.queryUserById(1);
System.out.println(user1);
User user2=userMapper.queryUserById(1);
System.out.println("================================");
System.out.println(user2);
System.out.println(user1==user1);
sqlSession.close();
}
如图,查询语句只执行了一次,由此可见,第二次查询是从缓存中获取的信息
。