之前有给大家介绍过mybatis二级缓存缺陷,那么下面要给大家介绍的就是mybatis二级缓存的原理,一起来看看吧。
和mybatis一级缓存比较起来,二级缓存的范围要更大一些,能够被多个SqlSession所共用。
同样的发送相同的查询sql会先去缓存当中找,找不到的话,就会去查询数据库,每一个namespace的mapper都会有自己的一个缓存的空间。
假如说,两个mapper的namespace都是一样的,执行mapper查询到的数据将存储到相同的二级缓存,同样的,假如有sqlSession执行了,commit会清空二级缓存。
配置文件
在sqlMapConfig.xml当中
<setting name="cacheEnabled" value="true"/>
在相应的mapper.xml当中
假如说,不需要二级缓存,那么可以在设置禁用二级缓存。
<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工具网的常见问题栏目来了解吧。
推荐阅读: