mybaits一级缓存和二级缓存

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.xml 的二级缓存,如果现在有一个用户执行了相同的请求,那么会直接走缓存查询 。如果在第二个相同的请求执行之前,有一个 ipdate user set name = xxx where id = 1 的请求过来修改了user表的数据,那么就会刷新二级缓存,但是这个请求刷新的是userMapper.xml的缓存。那么就有了一个问题  ,在第三个人在执行和第一个人相同的请求的时候就会走缓存,但是第二个人更改了user表的数据, 但是accountMapper.xml的缓存依然有效, 这个时候走accountMapper.xml的缓存而不走数据库,那么就会出现缓存数据不一致的问题。

 

所有对数据库表的改变操作都会刷新缓存,UserMapper.xml中有大多数针对user表的操作,但是在另外一个accountMapper.xml中,还有对user表的查询操作,这会导致user在两个命名空间下的数据不一致,

如果在UserMapper.xml中做了刷新缓存的操作,在AccountMapper.xml中缓存仍然有效,如果再次针对user的表有查询操作,使用缓存查询到的结果可能会不正确, redis可以很多好的解决这个问题,redis可以搭建再其他服务器上,缓存容量可扩展,redis可以灵活的使用缓存数据,比如做一些热点数据,统计点赞等

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

 

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

 

 



 

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

 

 

动态SQL标签 : 

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

insert  update  delete

 

 

#{id}   parperStatment

${id} Statement

 

posted @ 2021-03-07 00:32  余一洋  阅读(176)  评论(0编辑  收藏  举报