title: Mybatis中的缓存
tags: 新建,模板,小书匠
想要了解Mybatis中的缓存机制,我们先来看什么是缓存,简单来说,缓存就是存在于内存中的临时数据。
那么,我们为什么要使用缓存呢,就是为了减少与数据库的交互次数,提高执行效率。
那么问题来了,什么样的数据适合存在于缓存中呢:首先是经常使用且不经常进行增删改查的数据,再有便是数据的正确性对结果影响不大的数据。
于是自然就有不适用使用缓存的数据:经常改变的数据以及数据的正确性对结果影响很大的数据就不适合用缓存去处理。
Mybatis中的一级缓存与二级缓存
一级缓存是指存在于sqlsession对象中的缓存,当我们执行完一次查询后,sqlsession对象会将我们的查询结果存储在一个map中,当我们再次执行查询,sqlsession会首先从该map中查找数据,若能够查到,则直接返回。查不到则执行查询。值得注意的是,一级缓存依托于sqlsession存在,若sqlsession对象消失,一级缓存消失。
同时还应注意:调用sqlsession对象的close(),commit(),以及数据的增删改时,都会清空一级缓存。
二级缓存
二级缓存指的是sqlsessionFactory对象中的缓存,是由一个sqlsessionFactory创建出来的sqlsession共享一块数据
二级缓存的使用步骤:
- 在sqlMapConfig.xml中开启设置支持二级缓存
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
- 在当前映射文件中配置支持二级缓存
<!-- 开启user支持二级缓存-->
<cache/>
- 在当前方法select中支持二级缓存
<select id="findById" resultType="user" parameterType="Integer" useCache="true">
select * from user where id = #{id};
</select>
以图为证
我们可以看到只执行了一次查询,第二次是使用了缓存直接查找,但是有创建了一个新的user对象,这是什么原因呢。
因为二级缓存中数据的存储形式不是以对象形式存储,更像是以列表类型的数据,当从缓存中拿出数据时,会将列表中的数据封装成对象,这也就是两次对象不一致的原因。