ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Mybatis缓存 —— Mybatis(十一)

2020-04-11 15:02:36  阅读:195  来源: 互联网

标签:十一 缓存 映射 SqlSession 用户 二级缓存 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 接口,这种就可以使用序列化方式来保存对象。

 

标签:十一,缓存,映射,SqlSession,用户,二级缓存,Mybatis,查询
来源: https://www.cnblogs.com/guancangtingbai/p/12679683.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有