# 功能篇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();
