一级缓存是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 接口,这种就可以使用序列化方式来保存对象。
原文:https://www.cnblogs.com/guancangtingbai/p/12679683.html