Mybatis的一级缓存和二级缓存以及它们的区别

 一、     缓存(cache),数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在缓冲区中,应用程序从缓冲区读取数据。使用缓存的优点:数据库取出的数据保存在内存中,具备快速读取和使用。缺点:读取时无需再从数据库获取,数据可能不是最新的。
二、       mybatis缓存的作用是减少 Java Application 与数据库的交互次数,从而提升程序的运行效率。以下是适合使用缓存:经常查询并且不经常改变的数据的正确与否对最终结果影响不大的
比如:一个公司的介绍,新闻等。不适合用于缓存的例子:经常改变的数据 数据的正确与否对最终结果影响很大比如商品的库存,股市的牌价等。mybatis的缓存分为一级缓存,二级缓存以及自定义缓存。
三、       mybatis一级缓存是会话(session)级别的缓存(它是默认开启的),它是在一次会话操作内可以再次访问的缓存。不同的sqlsession之间的一级缓存是互不受影响的。一级缓存也分两个级别: SESSION和STATEMENT,默认的缓存级别为SESSION。STATEMENT级别是指缓存针对当前执行的查询有效,故每次执行完就清理缓存,即相当于没有缓存。
 
 一级缓存的工作流程:
1.对于某个查询指令,根据该指令生成key
2.判断在本地缓存中,key是否有对应的数据存在
3.如果命中则直接跳过查询数据库,使用缓存
4.如果没命中则在数据库中查找相应数据,得到查询结果
5.将key和此次查询结果的value放入本地缓存
6.然后将查询结果返回
7.判断缓存的级别,如果是STATEMENT级别,则清空缓存
一级缓存失效的情况
1.不同的sqlsession访问
2.同一个sqlsession查询条件不同
3.同一个sqlsession两次查询之间进行了增删改等操作
4.同一个sqlsession两次查询之间手动清除了缓存
                    

四、       mybatis二级缓存是映射器(mapper)级别的缓存,它是在同一个mapper下多个sqlsession可以共用一个二级缓存,二级缓存是跨sqlsession的。二级缓存相对于一级缓存来说实现了数据的共享,可控性更强,但由于设计的缺陷安全使用的条件非常苛刻,极大可能出现数据错误,分布式环境下必然会出现读取到错误的数据,所以一般不使用。

 二级缓存的工作机制:


一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中。
新的会话查询信息,就可以从二级缓存中获取内容.
不同的mapper查出的数据会放在自己对应的缓存中。

全局缓存默认是关闭的,需要在配置文件中设置开启全局缓存,开启全局缓存的步骤:

1.开启全局缓存
<setting name="cacheEnabled" value="true"/>
2.在要使用二级缓存的Mapper中开启
<!--在当前mapper.xml中使用二级缓存-->
3.我们需要将查询到的pojo对象序列化,否则会报错。


总结:

只要开启了二级缓存,在同一个Mapper下就会生效
所有数据都会先放在一级缓存中
只有当会话提交,或者关闭的时候,才会提交到二级缓存


缓存执行顺序:


先看二级缓存中有无
再看一级缓存中有无
查询数据库(查询到的数据会先放到缓存然后再读取)


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值