mybatis二级缓存原理是怎样的?原理详解

KLQ 2020-06-04 15:39:36 java常见问答 5531

之前有给大家介绍过mybatis二级缓存缺陷,那么下面要给大家介绍的就是mybatis二级缓存的原理,一起来看看吧。

mybatis一级缓存比较起来,二级缓存的范围要更大一些,能够被多个SqlSession所共用。

同样的发送相同的查询sql会先去缓存当中找,找不到的话,就会去查询数据库,每一个namespace的mapper都会有自己的一个缓存的空间。

假如说,两个mapper的namespace都是一样的,执行mapper查询到的数据将存储到相同的二级缓存,同样的,假如有sqlSession执行了,commit会清空二级缓存。

配置文件

在sqlMapConfig.xml当中

<setting name="cacheEnabled" value="true"/>

在相应的mapper.xml当中

mybatis二级缓存原理

假如说,不需要二级缓存,那么可以在设置禁用二级缓存。

<select useCache="false"></select>

这样的话,每次都是从数据库当中读取的,在执行insert、update、delete之后,会刷新缓存,将缓存清空,可以设置不刷新。

一般的话,都是不设置的,因为设置很有可能会导致脏读。

<insert flushCache="false"></insert>

示例

SqlSession session1 = factory.openSession();
SqlSession session2 = factory.openSession();
SqlSession session3 = factory.openSession();
UserMapper mapper1 = session1.getMapper(UserMapper.class);
UserMapper mapper2 = session2.getMapper(UserMapper.class);
UserMapper mapper3 = session3.getMapper(UserMapper.class);
//第一次请求,查询id为1的用户
User user1 = mapper1.findUserById(1);
System.out.println(user1);
//close 将数据写入二级缓存
session1.close();
//清空二级缓存,UserMapper下的
user1.setUsername("mmm");
mapper3.updateUser(user1);
session3.commit();
//第二次查询会从缓存中找
User user2 = mapper2.findUserById(1);
System.out.println(user2);
session2.close();

注意了,这里的话,要进行二级缓存的对象一定得实现Serilizable接口。

之所以这样的原因,主要是因为这些存数据可能会反序列化/java/post/1066.html写到硬盘又或者是其他的地方去。

关于mybatis二级缓存原理就给大家介绍到这里啦,假如你还想了解更多关于mybatis二级缓存的相关内容,那么请继续关注奇Q工具网的常见问题栏目来了解吧。

推荐阅读:

mybatis缓存的作用是什么?mybatis缓存有几种?

mybatis一对多是什么?有何作用?

mybatis批量插入如何实现?有几种方式?