今天就跟大家聊聊有关MyBatis中一级缓存与二级缓存的区别,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
<强>一级缓存强>
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造SqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个SqlSession中,不同的SqlSession中的缓存是互相不能读取的。
<强>一级缓存的工作原理:强>
用户发起查询请求,查找某条数据,SqlSession先去缓存中查找,是否有该数据,如果有,读取;
如果没有,从数据库中查询,并将查询到的数据放入一级缓存区域,供下次查找使用。
但SqlSession执行提交,即增删改操作时会清空缓存。这么做的目的是避免脏读。
如果提交不清空缓存,会有以下场景:一查询了某商品库存为10件,并将10件库存的数据存入缓存中,之后被客户买走了10件,数据被删除了,但是下次查询这件商品时,并不从数据库中查询,而是从缓存中查询,就会出现错误。
既然有了一级缓存,那么为什么要提供二级缓存呢?
二级缓存是映射器级别的缓存,多个SqlSession去操作同一个映射器的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存的作用范围更大。
还有一个原因,实际开发中,MyBatis通常和弹簧进行整合开发.Spring将事务放到服务中管理,对于每一个服务中的SqlSession是不同的,这是通过mybatis-spring中的<代码> org.mybatis.spring.mapper。MapperScannerConfigurer 代码>创建sqlsession自动注入到服务中的。
每次查询之后都要进行关闭sqlsession,关闭之后数据被清空,所以春天整合之后,如果没有事务,一级缓存是没有意义的。
<强>二级缓存原理:强>
二级缓存是映射器级别的缓存,多个sqlsession去操作同一个映射器的sql语句,多个sqlsession可以共用二级缓存,二级缓存是跨sqlsession的。
usermap有一个二级缓存区域(按名称空间分),其它映射器也有自己的二级缓存区域(按名称空间分)。每一个名称空间的映射器都有一个二级缓存区域,两个映射器的名称空间如果相同,这两个映射器执行sql查询到数据将存在相同的二级缓存区域中。
<强>开启二级缓存:强>
1,打开总开关
在MyBatis的配置文件中加入:
& lt;跨度祝辞& lt; settings> & lt; !——开启二级缓存——比; & lt;设置名称=癱acheEnabled"值https://www.yisu.com/zixun/=" true "/> 设置>
2,在需要开启二级缓存的映射。xml中加入caceh标签
& lt;跨度祝辞& lt;缓存/祝辞& lt;/span>
3,让使用二级缓存的POJO类实现可序列化的接口
& lt;跨在公开课用户实现了Serializable {} & lt;/span>
<强>测试一下强>
& lt;跨度祝辞@Test 公共空间testCache2()抛出异常{ SqlSession sqlSession1=sqlSessionFactory.openSession (); SqlSession sqlSession2=sqlSessionFactory.openSession (); usermap userMapper1=sqlSession1.getMapper (UserMapper.class); 用户user1=userMapper1.findUserById (1); System.out.println (user1); sqlSession1.close (); usermap userMapper2=sqlSession2.getMapper (UserMapper.class); 用户user2=userMapper2.findUserById (1); System.out.println (user2); sqlSession2.close (); }& lt;/span>
<强>输出结果:强>
& lt;跨在调试[主要]- [com.iot.mybatis.mapper缓存命中率。usermap): 0.0 调试(主要)- - -打开JDBC连接 调试(主要)——创建连接103887628。 调试(主要)-设置自动提交虚假>看完上述内容,你们对MyBatis中一级缓存与二级缓存的区别有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。MyBatis中一级缓存与二级缓存的区别