Mybatis缓存及注意点

一级缓存

一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。 一级缓存是默认开启的不用配置。

@Autowiredprivate 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等操作后,再次联表查询可能会造成脏读;

所以二级缓存适合那种所有人可以共享的数据,且这种数据不能经常增删改,因为这些操作会导致缓存清空,这样下次查询的话还是要连接数据库,这样二级缓存就起不到提高效率的功能了。

来源:https://www.icode9.com/content-4-770451.html

(0)

相关推荐