Mybatis缓存 —— Mybatis(十一)

一级缓存

  一级缓存是SqlSession级别的缓存,只要SqlSession没有flush或者close,它就存在。

  当调用SqlSession的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。

  第一次发起查询用户id为1的用户信息,先去缓存中查找是否有id为1的用户信息,如果没有,从数据库查询用户信息。

  得到用户信息后,将用户信息存储到一级缓存当中。

  如果sqlSession去执行commit操作,清空SqlSession中的一级缓存,这样做的目的是为了让缓存中存储的是最新的信息,避免脏读。

  第二次发起查询用户id为1的用户信息,先去缓存中查找是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

二级缓存

  二级缓存是mapper映射级别的缓存,多个SqlSession去操作同一个Mapper映射的sql语句。

  多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

  开启Mybatis的二级缓存后,SqlSession1去查询用户信息,查询到的用户信息会将查询数据存储到二级缓存当中,

  如果SqlSession3去执行相同Mapper映射下的sql,执行commit提交,将会清空该Mapper映射下的二级缓存区域的数据。

  SqlSession2去查询与SqlSession1相同的用户信息,会先从缓存中查找是否存在数据,如果存在直接从缓存中取出数据。

  

二级缓存的开启和关闭

  在SqlMapConfig,xml文件中开启二级缓存

<settings>
  <!-- 开启二级缓存的支持 --> <setting name="cacheEnabled" value="true"/>
</settings>

因为 cacheEnabled 的取值默认就为
true,所以这一步可以省略不配置。为 true 代表开启二级缓存;为false 代表不开启二级缓存。

  配置相关的Mapper映射文件,<cache>标签表示当前这个 mapper 映射将使用二级缓存,区分的标准就看 mapper 的 namespace 值。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper 
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 

<mapper namespace="com.itcast.dao.IUserDao">   <!-- 开启二级缓存的支持 -->   <cache></cache> </mapper>

  配置statement上面的useCache属性

<!-- 根据 id 查询 --> 
<select id="findById" resultType="user" parameterType="int" useCache="true">   select * from user where id = #{uid} </select>

  将 UserDao.xml 映射文件中的<select>标签中设置 useCache=”true”代表当前这个 statement 要使用二级缓存,如果不使用二级缓存可以设置为 false。 注意:针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。

  当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,这种就可以使用序列化方式来保存对象。

猜你喜欢

转载自www.cnblogs.com/guancangtingbai/p/12679683.html