# 功能篇3 一级、二级缓存
1 缓存
- 在计算机硬件中,CPU与内存之间设置有高速缓存,可以减少CPU频繁的向内存取消息。其原理简述为:第一次从内存调入数据时,在高速缓存中备份一份,下次还需要这个数据,就直接从高速缓存中取就行了,不需要访问内存。
此处的缓存是软件的缓存,如果查询语句相同,有必要向远程的数据库服务器再次发送请求吗?大多数情况下是不用,可以在MyBatis提供的缓存机制中找到数据,减少了网络I/O。
2 一级缓存
2.1 特点
2.2 举例
代码
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//一级缓存在Session对象里
SqlSession session1 = sqlSessionFactory.openSession();
// 通过类对象获得映射器
CategoryMapper mapper1 = session1.getMapper(CategoryMapper.class);
Category c1 = mapper1.get(1);
System.out.println(c1);
Category c2 = mapper1.get(1);
System.out.println(c2);
session1.commit();
session1.close();
//不同的Session之间不能共享缓存
SqlSession session2 = sqlSessionFactory.openSession();
CategoryMapper mapper2 = session2.getMapper(CategoryMapper.class);
Category c3 = mapper2.get(1);
System.out.println(c3);
session2.commit();
session2.close();
- 现象:不同的Session之间缓存不共享
3 二级缓存
2.1 特点
二级缓存在SqlSessionFactory中,需要手动开启
2.2 举例
- 主配置文件中setting结点
<setting name="cacheEnabled" value="true"/>
- 在一个注解映射文件的接口上或者方法上用cache注解
//开启二级缓存
@CacheNamespace(blocking = true)
public interface CategoryMapper {
- 或者在xml映射文件上cache结点
<mapper namespace="com.how2java.pojo">
<cache/>
<insert id="addCategory" parameterType="Category" >
insert into category_ ( name ) values (#{name})
</insert>
- 代码
//一级缓存在Session对象里
SqlSession session1 = sqlSessionFactory.openSession();
// 通过类对象获得映射器
CategoryMapper mapper1 = session1.getMapper(CategoryMapper.class);
System.out.println("Session1操作");
Category c1 = mapper1.get(1);
System.out.println(c1);
Category c2 = mapper1.get(1);
System.out.println(c2);
session1.commit();
session1.close();
//二级缓存下不同的Session之间也能共享缓存
SqlSession session2 = sqlSessionFactory.openSession();
CategoryMapper mapper2 = session2.getMapper(CategoryMapper.class);
System.out.println("Session2操作");
Category c3 = mapper2.get(1);
System.out.println(c3);
session2.commit();
session2.close();