标签:一个用户 没有 刷新 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标签 :
insert update delete
#{id} parperStatment
${id} Statement
标签:一个用户 没有 刷新 HERE 有一个 数据 技术 作用 数据库
原文地址:https://www.cnblogs.com/yuyyg/p/14493210.html