这篇文章,主要介绍MyBatis中二级缓存相关配置信息。

目录

一、MyBatis二级缓存

1.1、cache标签相关属性

(1)eviction属性

(2)size属性

(3)flushInternal属性

(4)readOnly属性

(5)type属性


一、MyBatis二级缓存

缓存的作用就是暂时将数据保存在计算机的内存里面,这样,下次查询的时候可以直接从内存里面获取数据,而不用再到数据库里面查询,从而提高了查询效率。

因为是将数据保存再内存里面的,所以不能保存太多数据,这样就需要对二级缓存做一些处理,例如:当缓存过多的时候,要怎么办,最多保存多少缓存数据,刷新缓存的时间等等配置,下面详细介绍一下。

1.1、cache标签相关属性

在XML映射文件中,使用【<cache/>】标签启用二级缓存,这个标签中有许多的属性可以用于设置二级缓存。

(1)eviction属性

eviction属性用于指定缓存回收策略,这里的回收策略就是指:当MyBatis二级缓存过多的时候,需要采用哪种方式将缓存删除一些。

eviction属性的可选值有如下几个:

  • LRU(Least Recently Used):最近最少使用,缓存过多时候,首先删除最久时间没有使用的缓存数据。
  • FIFO(First In First Out):先进先出,缓存过多时候,按照缓存保存的先后顺序删除,先保存的先删除。
  • SOFT(软引用):缓存过多时候,按照软引用规则删除数据。
  • WEAK(弱引用):缓存过多时候,按照弱引用规则删除数据。

二级缓存默认采用的是【LRU】回收策略。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper"><!-- 启用二级缓存 --><cache eviction="LRU"/><!-- 缓存查询 --><select id="query" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">select * from user<where><if test="username != null">and username = #{username}</if><if test="password != null">and password = #{password}</if><if test="id != null">and id = #{id}</if></where></select>
</mapper>

(2)size属性

size属性,用于设置二级缓存最多能够存储多少个引用对象,也就是最多保存多少对象。当数据超过设置的大小之后,多余的数据不会保存到二级缓存里面。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper"><!-- 启用二级缓存 --><cache eviction="LRU" size="1"/><!-- 缓存查询 --><select id="query" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">select * from user<where><if test="username != null">and username = #{username}</if><if test="password != null">and password = #{password}</if><if test="id != null">and id = #{id}</if></where></select>
</mapper>

(3)flushInternal属性

flushInternal属性,用于设置二级缓存的刷新时间间隔,单位是:【毫秒】。MyBatis默认情况是不会设缓存刷新时间间隔的,并且只有在执行对应的SQL查询语句之后,才会触发缓存刷新的时间间隔。

举个例子:设置缓存刷新时间间隔为3000毫秒,那么在调用对应的查询方法之后,过了3000毫秒之后就会刷新一次二级缓存。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper"><!-- 启用二级缓存 --><cache eviction="LRU" size="1" flushInterval="1000"/><!-- 缓存查询 --><select id="query" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">select * from user<where><if test="username != null">and username = #{username}</if><if test="password != null">and password = #{password}</if><if test="id != null">and id = #{id}</if></where></select>
</mapper>

(4)readOnly属性

readOnly属性,用于标识缓存数据是否只读,取值是:true和false。

  • readOnly设置为true时候,那么从缓存中查询出来的数据是原数据,一般不能够进行修改操作,表示只读状态。
  • readOnly设置为false时候,那么从缓存中查询出来的数据是原数据的一个副本,可以对副本数据进行修改,不影响原数据。

下面通过一个案例来解释一下readOnly属性的使用。

  • 配置二级缓存只读。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper"><!-- 启用二级缓存 --><cache eviction="LRU" size="5" flushInterval="10000" readOnly="true"/><!-- 缓存查询 --><select id="query" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">select * from user<where><if test="username != null">and username = #{username}</if><if test="password != null">and password = #{password}</if><if test="id != null">and id = #{id}</if></where></select>
</mapper>
  • 查询缓存数据。
// 执行操作
User user = new User();
user.setUsername("测试二级缓存");// 第一次查询
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> query = userMapper.query(user);
System.out.println("第一次查询打印结果: ");
query.forEach(System.out::println);
// 关闭 SqlSession
sqlSession.close();
// 修改查询出来的缓存数据: 注意一定要在close() 之后修改,这样才能够修改二级缓存中的数据
for (User user1 : query) {// 修改缓存数据user1.setUsername("csdn");
}// 第二次读取数据
SqlSession sqlSession2 = sqlSessionFactory.openSession();
UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
List<User> query2 = userMapper2.query(user);
System.out.println("第一次查询打印结果: ");
query2.forEach(System.out::println);
// 关闭 SqlSession
sqlSession2.close();

运行上面代码,控制台查看输出结果,这个时候可以看到第一次查询出来的数据和第二次查询出来的数据结果不一样,第二次将缓存数据给修改了。

当我们设置【flushInternal="false"】的时候,这个时候,在执行上面的代码,可以发现缓存中的数据没有被修改。

(5)type属性

type属性,用于设置自定义的缓存实现类,这个type属性几乎不怎么用,除非需要自定义缓存的逻辑(例如:项目中不使用MyBatis提供的二级缓存,而是需要使用第三方提供的缓存功能,如:Redis、Ehcache等第三方缓存)。如果没有设置type属性,那么会默认采用MyBatis框架中提供的缓存实现类【PerpetualCache】。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper"><!-- 启用二级缓存 --><cache eviction="LRU" size="5" flushInterval="10000" readOnly="false"type="org.apache.ibatis.cache.impl.PerpetualCache"/><!-- 缓存查询 --><select id="query" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">select * from user<where><if test="username != null">and username = #{username}</if><if test="password != null">and password = #{password}</if><if test="id != null">and id = #{id}</if></where></select>
</mapper>

如果需要自定义的缓存逻辑,可以编写一个类,然后实现【Cache】接口,重写其中的方法即可。

package com.mybatis.demo.cache;import org.apache.ibatis.cache.Cache;/*** @author ZhuYouBin* @version 1.0.0* @Date: 2022/9/3 19:52* @Description*/
public class CustomCache implements Cache {@Overridepublic String getId() {return null;}@Overridepublic void putObject(Object o, Object o1) {}@Overridepublic Object getObject(Object o) {return null;}@Overridepublic Object removeObject(Object o) {return null;}@Overridepublic void clear() {}@Overridepublic int getSize() {return 0;}
}

注意:MyBatis的二级缓存一般不会使用,而是使用自定义的第三方缓存,例如:EHCache。

以上,就是MyBatis二级缓存相关的配置信息。

综上,这篇文章结束了,主要介绍MyBatis中二级缓存相关配置信息。

【MyBatis笔记12】MyBatis中二级缓存相关配置内容相关推荐

  1. ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存

    ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate  : Hibernate是一个持久层框架,经常访问物理数据库 ...

  2. MyBatis二级缓存的配置

    Mybatis的二级缓存配置非常简单,只需要在mapper.xml中添加一句 <cache /> 如果需要跟详细的配置可以配置其属性 <mapper namespace=" ...

  3. mysql二级缓存,mybatis的动态sql和二级缓存

    mybatis的#{}和${}的区别就像是 PreparedStatement 和statement , 使用${}接收的参数还需用@Param注解修饰 , 推荐用#{} 动态SQL MyBatis ...

  4. Hibernate中二级缓存配置

    实体类 : 1 package cn.happy.entity; 2 public class Emp { 3 private Integer empNo; 4 private String empN ...

  5. Mybatis笔记整理1(基本文件与配置,三种方式完成数据库操作)

    基本文件与配置 pojo类,省略setget,tostring方法 public class User implements Serializable {/*** */private static f ...

  6. windows下 apache 二级域名相关配置

    小编今天给大家总结下 windows 下 apache的二级域名的相关配置 利用.htaccess将域名绑定到子目录 下面就利用本地127.0.0.1进行测试 我们这里以 www.jobs.com 为 ...

  7. xampp 中 mysql的相关配置

    最近开始接触PHP,而一般搭建PHP环境使用的都是xampp 这个集成环境,由于之前我的系统中已经安装了mysql服务,所以在启动mysql的时候出现一些列错误,我通过查询各种资料解决了这个问题,现在 ...

  8. 关于NodeJS中JSON5的相关配置和使用

    前言 JSON5是JSON的一个扩展子集.因此它完全兼容老JSON,并且还有自己独有的特性: 支持注释 不强求双引号,可以使用单引号 键值对的键可以不用双引号括起来 允许最后一个元素还可以跟加逗号 举 ...

  9. gradle相关配置内容解析

    gradle 项目的构建工具,基于groovy语言.主要用于管理依赖包. as中一般将gradle下载在C:\Documents and Settings<用户名>.gradle\wrap ...

最新文章

  1. 20162313苑洪铭 第一周作业
  2. 屏蔽firefox浏览器连接失败页面的广告
  3. 给ModalPopupExtender控件添加弹出关闭等事件
  4. nginx在linux上安装,Nginx在linux上安装步骤
  5. k8s包管理器helm_K8S 实战(十九)| K8S 包管理 Helm
  6. SQL - 创建一个学生表,要求有主键约束和非空约束
  7. 电力项目十--整合文本编辑器
  8. rails使用html form,Rails 页面多选下拉框, form_for, form_tag 使用技巧及 select2 使用
  9. k8s搭建dashboard可视化界面
  10. 自动化测试之—Hamcrest匹配器
  11. 变化世界中的军事地质学
  12. FTL 算法之Arbiter
  13. Linux固态硬盘 设置写入缓存,固态硬盘做缓存如何设置
  14. selenium怎样定位web提示语
  15. Android App 增量更新实例(Smart App Updates)
  16. virtualbox 创建桥接网络_VirtualBox 配置虚拟网卡(桥接),实现主机-虚拟机网络互通...
  17. 基于FPGA的UART串口通信实验(VHDL语言实现)
  18. [ 利器篇 ] - 升级Ubuntu 18.04系统工具集合
  19. iis8不支持 aspnet_regiis.exe -iru 命令的解决办法
  20. 显示qq在线状态的源码

热门文章

  1. BUUCTF MISC刷题笔记(一)
  2. 杭电2019多校第三场 HDU-6608 Fansblog(威尔逊定理+大数判素数+逆元)
  3. HTML5期末大作业:电影网站设计——电影(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  4. 循环练习——猜数字游戏
  5. visual studio进入时许可证已过期解决方案
  6. 解决 k8s flannel网络 一直 Init:ImagePullBackOff和coredns状态为Pending
  7. 你连HTTPS 原理都不懂,还给我讲“中间人攻击”
  8. Java程序员未来的三大就业方向
  9. 随机信号处理的一些归纳
  10. Failed to download repo mpvue/mpvue-quickstart:tunneling socket co uld not be established