码迷,mamicode.com
首页 > 其他好文 > 详细

mybaits一级缓存和二级缓存

时间:2021-03-08 13:29:38      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:一个用户   没有   刷新   HERE   有一个   数据   技术   作用   数据库   

Mapper 接口如何实现方法的?

通过JDK 的动态代理

 

mybaits 一级缓存和二级缓存

mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。

Mybatis的一级缓存是默认开启的,它只相对于同一个SqlSession有效,所以也称之为SqlSession缓存。当参数和SQL完全相同的情况下,使用同一个SqlSession对象调用同一个Mapper方法,在第1次执行SQL语句后,MyBatis会自动将其放在一级缓存中,后续再次相同的查询时,如果没有声明需要刷新,且缓存没有超时,会直接取出此前缓存的数据,而不会再次发送SQL到数据库。

Mybatis的二级缓存是默认未开启的,作用于同一个Mapper.xml 文件,如果要开启,需要在配置SQL的XML文件中配置<cache/>节点由于每个XML都通过根节点的namespace属性对应一个Mapper接口,所以,二级存储也称之为namespace缓存当开启二级缓存,第一个查询执行 select * from account left ioin user 查询,会先走MySQL 查询数据 然后数据缓存到二级缓存,这个请求的缓存会放在accountMapper 的二级缓存,如果现在有一个用户执行了相同的请求,那么会直接走缓存查询 。如果在第二个用户执行之前,有一个 ipdate user set name = xxx where id = 1 的请求过来,那么就会刷新二级缓存,但是这个请求刷新的是userMapper的缓存。那么就有了一个问题  ,在第三个人在执行和第一个人相同的请求的时候就会走缓存,但是第二个人更改了user表的数据,  这个时候走缓存而不走数据库,那么就会出现缓存数据不一致的问题。

二级缓存虽然可以在不同的SqlSession对象之间进行共享,但是它存在一个严重的问题就是数据不一致 。

 

二级缓存性能优于一级缓存,但是存在数据不一致问题 ,适用于数据实时性要求不高的情况下。
技术图片

 

 



 

 mybaits 底层是用来连个Map来存储   一个是 tcm 存储的二级缓存,如果二级缓存有就返回数据,如果二级缓存没有就查询一级缓存,如果 localCache 一级缓存没有就查询数据库 然后存到一级和二级缓存当中

 

 

动态SQL标签 : 

if  、choose(when,oterwise)  、 trim(where,set) 、 foreach 、bind

insert  update  delete

 

 

#{id}   parperStatment

${id} Statement

 

mybaits一级缓存和二级缓存

标签:一个用户   没有   刷新   HERE   有一个   数据   技术   作用   数据库   

原文地址:https://www.cnblogs.com/yuyyg/p/14493210.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!