在mybatis中一级缓存是默认打开的,二级缓存没有默认打开,需要主动配置。今天我们主要来说一级缓存的执行机制。
首先,我们应该了解为什么有缓存
如果没有缓存,那么java程序每次去数据库取数据的时候,都会直接去数据库取,如果取的是相同的数据,会大大影响效率,因为与数据库的链接本质就是网络链接,其中会有三次握手,网络较差等原因。这时,如果存在缓存,就会把取到的数据放到缓存中,在再次取出数据的时候就能直接去缓存中读取,避免直接操作数据库影响效率。
基本说明:
1、默认情况下,mybatis是启用一级缓存(本地缓存)的,它是sqlsession级别的,及随着会话关闭而关闭
2、同一个sqlsession接口对象调用了相同的select语句,会直接从缓存里面获取,而不是再去查询数据库
●一级缓存原理图
执行流程
首先,用户发送请求, mybatis就会得到他的sqlsession对象(可以理解成数据库的链接),然后调用在默认的DefaultSqlSession中的selectone方法中的selectList方法,默认情况下走的executor是CacheExecutor(补充说明:executor有许多种类),这是会执行一个query方法到二级缓存,但是前面说过二级缓存需要配置,所以他是空的,然后就会到本地缓存,如果也为空,这时就会调用doQuery方法去真正到数据库查询,然后得到数据,然后直接remove掉key为你参数的那条数据,然后重新放进去。注意:java只要到数据库去查了一次,在默认情况下他就一定会把查到的东西往你的一级缓存中重新放一次,相当于替换,因为他担心你的数据没有同步!所以不管你是否查询成功,他都会将其删掉。这时如果成功他才真正将数据放到一级缓存。此时再去重新查询,就会去一级缓存中取值。
其中的key是经过处理的,如果你传入是id号,他并不是简单的你传入的那个数,而是其底层将其转换为一个复杂的值,避免key重复
标签:缓存,一级,数据库,默认,mybatis,数据 From: https://blog.csdn.net/2401_83324467/article/details/142392133