# 功能篇3 一级、二级缓存

1 缓存

  1. 在计算机硬件中,CPU与内存之间设置有高速缓存,可以减少CPU频繁的向内存取消息。其原理简述为:第一次从内存调入数据时,在高速缓存中备份一份,下次还需要这个数据,就直接从高速缓存中取就行了,不需要访问内存。
  2. 此处的缓存是软件的缓存,如果查询语句相同,有必要向远程的数据库服务器再次发送请求吗?大多数情况下是不用,可以在MyBatis提供的缓存机制中找到数据,减少了网络I/O。

    2 一级缓存

    2.1 特点

    一级缓存在session中,自动开启

    2.2 举例

  3. 代码

  1. String resource = "mybatis-config.xml";
  2. InputStream inputStream = Resources.getResourceAsStream(resource);
  3. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  4. //一级缓存在Session对象里
  5. SqlSession session1 = sqlSessionFactory.openSession();
  6. // 通过类对象获得映射器
  7. CategoryMapper mapper1 = session1.getMapper(CategoryMapper.class);
  8. Category c1 = mapper1.get(1);
  9. System.out.println(c1);
  10. Category c2 = mapper1.get(1);
  11. System.out.println(c2);
  12. session1.commit();
  13. session1.close();
  14. //不同的Session之间不能共享缓存
  15. SqlSession session2 = sqlSessionFactory.openSession();
  16. CategoryMapper mapper2 = session2.getMapper(CategoryMapper.class);
  17. Category c3 = mapper2.get(1);
  18. System.out.println(c3);
  19. session2.commit();
  20. session2.close();
  1. 现象:不同的Session之间缓存不共享

功能篇3 一级、二级缓存 - 图1

3 二级缓存

2.1 特点

二级缓存在SqlSessionFactory中,需要手动开启

2.2 举例

  1. 主配置文件中setting结点
  1. <setting name="cacheEnabled" value="true"/>
  1. 在一个注解映射文件的接口上或者方法上用cache注解
  1. //开启二级缓存
  2. @CacheNamespace(blocking = true)
  3. public interface CategoryMapper {
  1. 或者在xml映射文件上cache结点
  1. <mapper namespace="com.how2java.pojo">
  2. <cache/>
  3. <insert id="addCategory" parameterType="Category" >
  4. insert into category_ ( name ) values (#{name})
  5. </insert>
  1. 代码
  1. //一级缓存在Session对象里
  2. SqlSession session1 = sqlSessionFactory.openSession();
  3. // 通过类对象获得映射器
  4. CategoryMapper mapper1 = session1.getMapper(CategoryMapper.class);
  5. System.out.println("Session1操作");
  6. Category c1 = mapper1.get(1);
  7. System.out.println(c1);
  8. Category c2 = mapper1.get(1);
  9. System.out.println(c2);
  10. session1.commit();
  11. session1.close();
  12. //二级缓存下不同的Session之间也能共享缓存
  13. SqlSession session2 = sqlSessionFactory.openSession();
  14. CategoryMapper mapper2 = session2.getMapper(CategoryMapper.class);
  15. System.out.println("Session2操作");
  16. Category c3 = mapper2.get(1);
  17. System.out.println(c3);
  18. session2.commit();
  19. session2.close();
  1. 现象功能篇3 一级、二级缓存 - 图2

    4 总结

  2. 一级缓存在session中,自动开启。

  3. 二级缓存在SqlSessionFactory中,需要手动开启。
    1. 现在主配置文件中开启。
    2. 然后再某个映射文件中开启,可以是注解映射文件或者xml映射文件