Mybatis缓存及注意点
作者:互联网
mybatis分为两级缓存
一级缓存
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。 一级缓存是默认开启的不用配置。
@Autowired
private SqlSessionFactory sqlSessionFactory;
@RequestMapping(value = "/testMybatis")
@ResponseBody
public void testMybatis(){
SqlSession sqlSession = sqlSessionFactory.openSession();
TestMapper testMapper = sqlSession.getMapper(TestMapper.class);
for (int i = 0; i < 3; i++) {
Test selectByPrimaryKey = testMapper.selectByPrimaryKey(5);
log.info("结果:"+ selectByPrimaryKey.getUsername());
}
注意点
同一个SqlSession只会执行一次SQL语句,只有当执行插入、更新、删除操作后,则会清空SqlSession中的一级缓存。只有查询的操作,一级缓存才不会被清除。
二级缓存
二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存的开启(实体类必须序列化),然后在配置文件里面配置。
@RequestMapping(value = "/testMybatis2")
@ResponseBody
public void testMybatis2(){
SqlSession openSession1 = sqlSessionFactory.openSession();
SqlSession openSession2 = sqlSessionFactory.openSession();
TestMapper mapper1 = openSession1.getMapper(TestMapper.class);
TestMapper mapper2 = openSession2.getMapper(TestMapper.class);
Test selectByPrimaryKey = mapper1.selectByPrimaryKey(5);
System.out.println(selectByPrimaryKey.getUsername());
openSession1.close();
Test selectByPrimaryKey2 = mapper2.selectByPrimaryKey(5);
System.out.println(selectByPrimaryKey2.getUsername());
openSession2.close();
}
注意点
1、开启Mybatis的二级缓存后,一级缓存同样起作用(相同的SqlSession一级缓存,不同的SqlSession二级缓存)
2、二级缓存,当一个SqlSession调用close方法将数据放入缓存中,后面的查询才能查到数据;只有一个SqlSession执行了增删改且提交了,才会清空缓存。如果只是执行了增删改而没有提交,只会清空一级缓存的数据,不会清空二级缓存的数据
3、在开启了mybatis二级缓存情况下,联表查询后,对表进行了update、delete、insert等操作后,再次联表查询可能会造成脏读;
所以二级缓存适合那种所有人可以共享的数据,且这种数据不能经常增删改,因为这些操作会导致缓存清空,这样下次查询的话还是要连接数据库,这样二级缓存就起不到提高效率的功能了。
标签:selectByPrimaryKey,缓存,二级缓存,SqlSession,注意,清空,Mybatis,TestMapper 来源: https://blog.csdn.net/weixin_45574009/article/details/110431155