其他分享
首页 > 其他分享> > Mybatis缓存及注意点

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