Mybatis缓存分为一级缓存和二级缓存

  • MyBatis一级缓存是默认开启的,数据存储范围是SqlSession会话这个级别,当SqlSession关闭后,缓存就会被清除,生命周期非常短。

  • MyBatis二级缓存需手动开启,二级缓存存储范围为Mapper Namespace(Mapper映射器的命名空间)

MyBatis缓存数据是存储在JVM内存中,它存储对象的本质是利用Map保存缓存数据。

二级缓存运行规则:

  • 二级缓存开启后,默认所有的查询操作均使用缓存
  • 写/插入操作commit提交时,对namespace缓存强制清空
  • 在select/update/insert/delete标签中,配置useCache=false代表不使用缓存,默认为true
  • 在select/update/insert/delete标签中,配置flushCache=true代表强制清空缓存,默认为false
@Test
public void demo(){SqlSession sqlSession = null;try{sqlSession = MyBatisUtils.openSession();//从数据库中获取数据,并放入缓存Blog blog = sqlSession.selectOne("queryBlogById", 45);//从缓存中获取数据Blog blog1 = sqlSession.selectOne("queryBlogById", 45);/* 对比两个会话的内存地址 */System.out.println(blog.hashCode() + "  :  " + blog1.hashCode());}catch (Exception e){throw e;}finally {MyBatisUtils.closeSession(sqlSession);}
}

开启MyBatis二级缓存

通过在mapper映射器文件中配置<cache/>标签来开启二级缓存:

    eviction属性是缓存的清除策略,当缓存对象数量达到上限时,自动触发MyBatis对应的算法清除缓存对象

        LUR - 最近最少使用的:移除最长时间不被使用的对象(建议使用)

        FIFO - 先进先出:按照对象进入缓存的顺序来移除它们

        SOFT - 软引用:移除基于垃圾回收器状态和软引用规则的对象

        WEAK - 弱引用:更积极地移除基于垃圾回收器状态和弱引用规则的对象

    flushInterval属性代表间隔多长时间自动清除缓存,单位毫秒,600000 = 10分钟

    size属性缓存存储对象或对象集合(一个对象集合算一个对象)数目上限,个人不建议对对象集合进行缓存

    readOnly属性: 设置为true,代表返回只读缓存,每次从缓存中取出的是缓存对象本身,执行效率高(建议使用)

           设置为false,代表每次取出的是缓存对象的“副本”,每次取出的对象都是不同的,安全性较高

<?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.cd.blog.dao.BlogDao"><!--开启二级缓存:eviction是缓存的清除策略,当缓存对象数量达到上限时,自动触发MyBatis对应的算法清除缓存对象LUR - 最近最少使用的:移除最长时间不被使用的对象FIFO - 先进先出:按照对象进入缓存的顺序来移除它们SOFT - 软引用:移除基于垃圾回收器状态和软引用规则的对象WEAK - 弱引用:更积极地移除基于垃圾回收器状态和弱引用规则的对象flushInterval代表间隔多长时间自动清除缓存,单位毫秒,600000 = 10分钟size缓存存储对象或对象集合(一个对象集合算一个对象)数目上限,个人不建议对对象集合进行缓存readOnly:设置为true,代表返回只读缓存,每次从缓存中取出的是缓存对象本身,执行效率高设置为false,代表每次取出的是缓存对象的“副本”,每次取出的对象都是不同的,安全性较高--><cache type="LUR" flushInterval="600000" size="512" readOnly="true"/><select id="selectById" parameterType="Integer" resultType="Blog">select *from t_blog where blog_id = #{blogId}</select><!--配置useCache="false"属性,代表该查询的数据不被放入缓存--><select id="selectAll" resultType="Blog" useCache="false">select *from t_blog</select><!--配置flushCache="true"属性,代表执行完update语句后立马清空缓存,而不是等到commit提交后--><update id="updateBlog" parameterType="Blog" flushCache="true">UPDATE t_blog<set><if test="title != null">title = #{title},</if><if test="content != null">content = #{content},</if><if test="description != null">description = #{description},</if></set>WHERE blog_id = #{blogId}</update><!--配置flushCache="true"属性,代表执行完insert语句后立马清空缓存,而不是等到commit提交后--><insert id="insertBlog" keyColumn="blog_id" keyProperty="blogId" useGeneratedKeys="true" parameterType="Blog" flushCache="true">INSERT INTO t_blog(title, content, description)VALUES(#{title}, #{content}, #{description})</insert>
</mapper>

二级缓存总结

1. MyBatis二级缓存需手动开启,二级缓存存储范围为Mapper Namespace(Mapper映射器的命名空间),而一级缓存是默认开启的,数据存储范围是SqlSession会话这个级别,当SqlSession关闭后,缓存就会被清除,生命周期非常短。

2. 二级缓存开启后,默认所有的查询操作均使用缓存。如果不想对查询结果缓存,可以在select标签中配置useCache=false设置不缓存查询结果

3. 建议只对查询单个对象的数据进行缓存,不对那些对象集合进行缓存,因为当一个对象集合中保存的对象很多的时候,就会消耗很多的内存。所以针对selectAll这种类型的查询结果时,建议配置useCache=false
设置不缓存该查询数据

MyBatis复习(六):MyBatis二级缓存相关推荐

  1. 深入浅出 MyBatis 的一级、二级缓存机制

    一.MyBatis 缓存 缓存就是内存中的数据,常常来自对数据库查询结果的保存.使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度. MyBatis 也提供了对缓存的支持,分为一级缓存和二级 ...

  2. redis springmvc mysql_SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置

    项目环境: 在SpringMVC + MyBatis + Mysql.Redis部署在Linux虚拟机. 1.整体思路 参考Ehcache实现MyBatis二级缓存代码(Maven引用对应jar查阅) ...

  3. mybatis注解开发使用二级缓存

    在SqlMapConfig中开启二级缓存支持 <!--配置开启二级缓存--><settings><setting name="cacheEnabled" ...

  4. mybatis学习(45):开启二级缓存

    目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; im ...

  5. Mybatis开启一级、二级缓存

    1.缓存 (1)概念:在内存中开辟的一个区域,用于存放数据,在内存中存放的数据叫做缓存. (2)好处:内存读取速度远快于硬盘,合理利用缓存,可以极大的提高查询的效率. 1.1 一级缓存 一级缓存的作用 ...

  6. SpringMVC + MyBatis + MySQL + Redis(作为二级缓存) 配置

    前言 Mybatis 有二级缓存,为什么还要用Redis? mybais一级缓存作用域是session,session commit之后缓存就失效了. mybais二级缓存作用域是sessionfac ...

  7. mysql redis缓存配置_SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置

    项目环境: 在SpringMVC + MyBatis + MySQL.Redis部署在Linux虚拟机. 1.整体思路 参考Ehcache实现MyBatis二级缓存代码(Maven引用对应jar查阅) ...

  8. SpringMVC +Spring + MyBatis + Mysql + Redis(作为二级缓存) 配置

    转载:http://blog.csdn.net/xiadi934/article/details/50786293 项目环境: 在SpringMVC +Spring + MyBatis + MySQL ...

  9. Mybatis的一、二级缓存的原理与使用、禁止指定方法的二级缓存与刷新缓存、Mybatis整合Ehcache、二级缓存的使用场景与局限性-day03

    目录 第一节 Mybatis的缓存 1.1 Mybatis的缓存理解 1.2 一级缓存 原理 使用与测试 1.3 二级缓存 原理 使用与测试 禁用指定方法的二级缓存 刷新缓存 总结 1.4 整合ehc ...

最新文章

  1. CTO的眼界到底有多宽
  2. iOS 11开发教程(二十)iOS11应用视图美化按钮之设置按钮的状态
  3. hdu 1757 A Simple Math Problem 构造矩阵
  4. C# hashtable
  5. 请确定指定的驱动器中是否有盘_百格拉伺服驱动器维修常见故障现象及处理方法...
  6. 『Golang』Martini框架入门
  7. 将图片显示在应用最上层_谷歌Chrome 75将原生支持lazy loading,动动手也可以抢先试玩...
  8. ffmpeg命令 抓屏_使用FFmpeg从视频中截图的命令 | 学步园
  9. oracle case套case,,套用when case
  10. 适合初学者的安卓开源项目_开源系列的初学者将从下周开始
  11. 阿里、字节年薪百万的测开专家,都在关注哪些前沿技术
  12. Reacr-Native Android 环境搭建 、运行项目(二)Window
  13. hadoop搭建部署
  14. 重庆计算机c语言二级成绩查询,历届重庆市计算机C语言二级考试试题及答案.pdf...
  15. Windows7 SP1旗舰版精简版最终版本
  16. 手机忘记开机密码怎么办?我来教你
  17. 数据挖掘技术-绘制人口数目直方图
  18. html静态页面作业——海贼王中乔巴漫画(5页) 学生动漫网页设计模板下载 海贼王大学生HTML网页制作作品 简单漫画网页设计成品
  19. jQuery设置attr()对样式属性失效的原因
  20. 秒云与趋动科技联合发布容器云平台与GPU资源池化整体解决方案

热门文章

  1. formSelects使用
  2. Android Studio导入project和module的方法
  3. The 6th Zhejiang Provincial Collegiate Programming Contest-ProblemA:Second-price Auction
  4. 针对 SQL Server 2008 在Windows Server 2008上的访问配置 Windows 防火墙
  5. 关于在WinForm里用HttpWebRequest获得某个页面,并填写页面的textbox及点击button的方法...
  6. Flutter fvm 多版本管理
  7. 一条SQL查询语句是如何执行的? MySql杂谈
  8. Flutter MaterialApp概述以及主题配置概述
  9. shutil——高级的 文件、文件夹、压缩包 处理模块
  10. django学习随笔:ManagementUtility