一级缓存和二级缓存
查询缓存
查询缓存的运行流程:
代码中的查询语句首先去缓存里尝试着读取一下,查看有没有,如果有的话直接返回,但是如果没有读取到的话,那么他去数据库读取SQL,然后SQL会把得到的查询结果先返回给缓存空间,最后呢在返回给我们的调用方,这就是缓存的工作机制。
接下首先自学
Mybatis的缓存,根据它的作用域和生命周期分为两种:
作用域区分:mybatis查询缓存的作用域是根据命名空间namespace划分的,相同的命名空间下的mapper放到同一个缓存区,无论是一级还是二级缓存 都是根据namespace存放的。
A命名空间下(比如学生这个namesp下的东西)那它存储和学生相关的东西,都在A命名空间下。
B命名空间下(比如部门这个namesp下的东西)那它存储和部门相关的东西,都在B命名空间下。
这是按命名空间来分的
一级和二级的不同
一级是SqlSession级别的,一旦SqlSession关闭,那么一级缓存中的数据就销毁了。
二级的生命周期与整个应用同步,与SqlSession关闭与否没有半毛线关系
换句话说就是一级缓存是在一个线程内共享数据,然而二级缓存是在n个线程内共享数据
一级缓存
小配置Sql语句
单测
方法
控制台
因为mybatis的一级缓存是不可卸载的。
什么叫不可卸载 就是天然集成,只要你用这个框架,一级缓存就没法消除(注意:数据消除不算卸载)。
重点:mybatis中是根据什么来区分他是一个线程内共享数据也就是一级缓存的依据是什么?
答案:mybatis缓存的底层是个map集合,map的value是查询结果,map的key则是查询依据,根据框架的架构不同,查询依据是不同的。所有mybatis的查询依据是Sql的id(小配置的对应的sql语句的id)+SQL语句(单测的数据赋值例如:查id2和3,所有sql语句是不同的也不能一级缓存)。
注意:系统增删改频繁千万不能用缓存!!!!
必须使用insert标签,不能使用select,否则试验不能成功。
二级缓存:
二级缓存分为:
内置二级缓存:由于mybatis从缓存中读取的依据与SQL的id相关,而并非查询出的对象,所以使用二级缓存的目的是:不是在多个查询之间共享查询结果(所有查询中只要查询结果中存在该对象,就直接从缓存中读取,这就是查询结果的共享),而是为了防止同一查询(相同的sqlid和相同的sql语句)的反复执行。
第三方二级缓存:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------