Mybatis--二级缓存(namespace级别)& 序列化
Posted Z && Y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis--二级缓存(namespace级别)& 序列化相关的知识,希望对你有一定的参考价值。
1. Mybatis--二级缓存(namespace级别)
- 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
- 基于namespace级别的缓存,一个名称空间,对应一个二级缓存
工作机制
- 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
- 如果会话关闭了,这个会员对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中
- 新的会话查询信息,就可以从二级缓存中获取内容
- 不同的mapper查询出的数据会放在自己对应的缓存中
一级缓存开启(SqlSession级别的缓存,也称为本地缓存)
- 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
- 为了提高可扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来定义二级缓存。
1.1 使用二级缓存
1.1.1 开启全局缓存(虽然默认是开启的,但是为了方便理解,还是显示的开启)
mybatis-config.xml
<!--显示的开启全局缓存-->
<setting name="cacheEnabled" value="true"/>
1.1.2 在Mapper.xml中使用缓存
可以使用默认的配置
<cache/>
使用默认的配置时,由于readOnly(只读)默认值是 false。需要通过序列化)返回缓存对象的拷贝。所以相关的实体类需要实现Serializable接口,使其支持序列化
序列化可以将一个对象转化成一段字符串编码,传输或者做存储处理,使用时再进行反序列,而字符串不用序列化的原因是如果你看过javaSE的源码,你就知道,字符串是已经实现了Serializable接口的,所以它已经是序列化了的
也可以自定义配置
<!--在当前Mapper.xml中使用二级缓存-->
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
测试:
BlogMapper.xml
测试方法:
@org.junit.Test
public void test01() {
SqlSession sqlSession1 = MybatisUtils.getSqlSession();
BlogMapper mapper1 = sqlSession1.getMapper(BlogMapper.class);
Map map = new HashMap();
map.put("title", "微服务");
List<Blog> blogs = mapper1.queryBlogIf(map);
for (Blog blog : blogs) {
System.out.println(blog);
}
sqlSession1.close();
System.out.println("==================");
SqlSession sqlSession2 = MybatisUtils.getSqlSession();
BlogMapper mapper2 = sqlSession2.getMapper(BlogMapper.class);
map = new HashMap();
map.put("title", "微服务");
blogs = mapper2.queryBlogIf(map);
for (Blog blog : blogs) {
System.out.println(blog);
}
sqlSession2.close();
}
1.1.3 小结
- 只要开启了二级缓存,在同一个Mapper下就有效
- 所有的数据都会放在一级缓存中
- 只有当前会话提交,或者关闭的时候,才会提交到二级缓存中
以上是关于Mybatis--二级缓存(namespace级别)& 序列化的主要内容,如果未能解决你的问题,请参考以下文章