MyBatis中一级缓存与二级缓存的区别

  介绍

今天就跟大家聊聊有关MyBatis中一级缓存与二级缓存的区别,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

<强>一级缓存

一级缓存是SqlSession级别的缓存。在操作数据库时需要构造SqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个SqlSession中,不同的SqlSession中的缓存是互相不能读取的。

<强>一级缓存的工作原理:

 MyBatis中一级缓存与二级缓存的区别

用户发起查询请求,查找某条数据,SqlSession先去缓存中查找,是否有该数据,如果有,读取;

如果没有,从数据库中查询,并将查询到的数据放入一级缓存区域,供下次查找使用。

但SqlSession执行提交,即增删改操作时会清空缓存。这么做的目的是避免脏读。

如果提交不清空缓存,会有以下场景:一查询了某商品库存为10件,并将10件库存的数据存入缓存中,之后被客户买走了10件,数据被删除了,但是下次查询这件商品时,并不从数据库中查询,而是从缓存中查询,就会出现错误。

既然有了一级缓存,那么为什么要提供二级缓存呢?

二级缓存是映射器级别的缓存,多个SqlSession去操作同一个映射器的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存的作用范围更大。

还有一个原因,实际开发中,MyBatis通常和弹簧进行整合开发.Spring将事务放到服务中管理,对于每一个服务中的SqlSession是不同的,这是通过mybatis-spring中的<代码> org.mybatis.spring.mapper。MapperScannerConfigurer 创建sqlsession自动注入到服务中的。

每次查询之后都要进行关闭sqlsession,关闭之后数据被清空,所以春天整合之后,如果没有事务,一级缓存是没有意义的。


<强>二级缓存原理:

 MyBatis中一级缓存与二级缓存的区别

二级缓存是映射器级别的缓存,多个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中一级缓存与二级缓存的区别