一 什么是缓存?
1 什么是缓存
缓存(cache):
- 储存在内存当中的临时数据。
- 将用户经常查询的数据放在缓存(内存)当中,用户去查询数据的时候就不需要再去磁盘(disk)上查询了,就去缓存当中查询,进而提高查询的效率,可以解决 高并发系统性能的问题
2 缓存的好处(为什么要缓存?)
我们查询数据的时候是需要去数据库当中访问的,如果有了 缓存就可以减少和数据库的交互次数,减少系统的开销,进而提高系统的效率。
3 什么样的数据可以使用缓存?
- 缓存是针对于经常查询且不常被改变的数据,
- 我们可以得知不经常查询且常被改变的数据 就不适用与缓存 缓存就是失效。
二 mybatis当中的缓存
- Mybatis包含一个非常强大的查询缓存的特性,它可以非常方便的定制和配置缓存。缓存可以极大的提高查询效率
- 在Mybatis当中定义了两种缓存: 一级缓存和二级缓存
- 默认情况下,是一级缓存(sqlsession级别的缓存,也可以叫她为本地缓存)
- 二级缓存需要手动开启和配置,是基于namespace级别的配置
- 为了提高扩展性,mybatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存。
1 一级缓存
一级缓存也可以被称为本地缓存
- 一级缓存是sqlsession级别的缓存,与数据库同一次会话期间(发出一次请求)的所查询到的数据会放入本地缓存(一级缓存)当中
- 如果需要获取相同的数据,直接在缓存当中获取,就不需要去数据库当中获取。(注意 是需要在sqlsseion 会话期间 如是关闭 一级缓存就没有了)
测试
编写UserMapper接口的方法=====》编写UserMapper.xml文件的sql语句====》编写测试类
------编写UserMapper接口的方法
public interface UserMapper {
User getUserByID(@Param("id") int id);
}
-----编写UserMapper.xml文件的sql语句
<mapper namespace="com.peng.dao.UserMapper">
<cache/>
<select id="getUserByID" parameterType="_int" resultType="User">
select * from user where id=#{id}
</select>
</mapper>
--------编写测试类
@Test
//测试一级缓存
public void testOneLevelCache(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapper mapper1 = sqlSession.getMapper(UserMapper.class);
User user1 = mapper1.getUserByID(1);
System.out.println(user1);
UserMapper mapper2 = sqlSession.getMapper(UserMapper.class);
User user2 = mapper2.getUserByID(1);
System.out.println(user2);
sqlSession.close();
}
结果展示:
我们可以从上图看出 :
用户1查询时的sql语句是:select * from user where id=? 访问了数据库 。
用户2查询的时候没有sql语句 没有访问数据库直接从一级缓存当中访问。
1.2一级缓存失效时机?
1. sqlsession会话相同但是查询不同的数据