一、MySQL
1、何时缓存:
- 缓存的 key:SQL (所以sql语句要完全相同才能使用上缓存)
缓存的 value:结果集 - where条件中如包含了某些函数永远不会被缓存, 比如current_date, now等
- 太大的结果集不会被缓存
2、何时缓存失效:
- 表数据有任何修改,则有关于该表的数据全部失效
二、MyBatis
1、一级缓存,一级缓存是SqlSession级别的缓存,对于相同的查询,会从缓存中返回结果而不是查询数据库
作用域是SqlSession
2、二级缓存,二级缓存是Mapper级别的缓存,定义在Mapper文件的标签中并需要开启此缓存,多个Mapper文件可以共用一个缓存,依赖标签配置。
作用域是一个NameSpace( 一般情况下一个NameSpace即一个Mapper)
二级缓存不建议使用,因为二级缓存有严重的使用问题:
例如:
MapperA联合查询AB表中数据
MapperA:select from tableA left join tableB on ……
MapperB修改了数据
MapperB:insert into tableB values ……
由于MapperA和MapperB不在同一个作用域,即使MapperB新增了数据,MapperA缓存也不会刷新,造成MapperA查到的数据是脏数据。
本文详细解析了MyBatis的一级与二级缓存机制,以及MySQL的缓存策略。阐述了一级缓存如何在SqlSession级别工作,二级缓存如何在Mapper级别生效,并探讨了二级缓存可能引发的脏数据问题。同时,文中还解释了MySQL缓存的触发条件及失效机制。
7569

被折叠的 条评论
为什么被折叠?



