mybatis的缓存内容(上)https://developer.aliyun.com/article/1429068
2.二级缓存
1.概念
二级缓存是MyBatis提供的全局性的缓存机制。它是指跨SqlSession的缓存,即多个SqlSession共享同一个缓存区域,因此可以避免多个SqlSession重复查询相同的数据。二级缓存需要在MyBatis的配置文件中开启,并在Mapper.xml文件中指定使用二级缓存。另外,需要注意的是,如果数据库中的数据发生了变化,则缓存中的数据也需要更新,MyBatis提供了相应的缓存策略来解决这个问题。
2.实现
简单来说就是通过同一个sqlSessionFactory提供的sqlSeesion那么它们共享一个缓存区
默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:
<cache/>
因为我们需要通过一个sqlFactory工厂所以上面的工具类是无法使用的,并且表 对应的实体类必须要序列化接口Serializable
代码进行修改如下:
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsStream); 参数true开启自动提交 SqlSession sqlSession = factory.openSession(true); EmpMapper mapper = sqlSession.getMapper(EmpMapper.class); mapper.selectEmpById(1); 注意一定要关闭第一个sqlSession要不然缓存还是将保存到一级缓存 sqlSession.close(); SqlSession sqlSession2 = factory.openSession(true); EmpMapper mapper1 = sqlSession2.getMapper(EmpMapper.class); mapper1.selectEmpById(1);
对应的实体类
ackage com.guigu.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @AllArgsConstructor @NoArgsConstructor public class Emp implements Serializable { private String id; private String empUsername; private Integer deptId; private Dept dept; }
观看运行日志如下
只要Cache Hit Ratio(缓存命中率)不为0就代表成功
3.缓存查询的顺序
先查询而二级缓存,有因为二级缓存中可能会有其他程序已经查询出来的数据,直接拿出来用即可
如过二级缓存没有,在查一级缓存。
如果一级缓存也没有则查询数据库
SqlSession关闭之后,一级缓存中的数据会写入二级缓存