缓存-提高检索效率的利器
缓存-官方文档
文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache
二级缓存
基本介绍
- 二级缓存和一级缓存都是为了提高检索效率的技术。
- 最大的区别就是作用域的范围不一样,一级缓存的作用域是sqlSession 会话级别,在一次会话有效,而二级缓存作用域是全局范围,针对不同的会话都有效。
二级缓存原理图
二级缓存快速入门
快速入门
- mybatis-config.xml 配置中开启二级缓存
<!--引入外部的jdbc.properties--> <properties resource="jdbc.properties"/> <!--配置MyBatis自带的日志输出-查看原生的sql--> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> <!-- 1、全局性地开启或关闭所有映射器配置文件中已配置的任何缓存, 可以理解这是一个总开关 2、默认就是: true --> <setting name="cacheEnabled" value="true"/> </settings>
- 使用二级缓存时entity 类实现序列化接口(serializable),因为二级缓存可能使用到序列化技术。不一定要实现,只是有的外部缓存需要。
在对应的XxxMapper.xml 中设置二级缓存的策略
<?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"> <!--解读 1. 这是一个mapper xml 文件 2. 该文件可以去实现对应的接口的方法 3. namespace 指定该xml文件和哪个接口对应!!! --> <mapper namespace="com.nlc.mapper.MonsterMapper"> <!-- 1、配置二级缓存: 是mybatis自带 2、FIFO – 先进先出:按对象进入缓存的顺序来移除它们。 3. flushInterval 刷新间隔 是毫秒单位 60000 表示 60s 4. size="512": 引用数目, 属性可以被设置为任意正整数, 默认1024 5. readOnly="true": (只读)属性可以被设置为 true 或 false: 如果我们只是用于读操作, 建议设置成 true, 这样可以提示效率, 如果有修改操作,设置成 false, 默认就是false --> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/> </mapper>
修改MonsterMapperTest.java , 完成测试
//测试二级缓存的使用 @Test public void level2CacheTest() { //查询id=3的monster Monster monster = monsterMapper.getMonsterById(3); System.out.println("monster=" + monster); //这里关闭sqlSession if (sqlSession != null) { sqlSession.close(); } //重新获取sqlSession sqlSession = MyBatisUtils.getSqlSession(); //重新获取了monsterMapper monsterMapper = sqlSession.getMapper(MonsterMapper.class); //再次查询id=3的monster System.out.println("--虽然前面关闭了sqlSession,因为配置二级缓存, " + "当你再次查询相同的id时, 依然不会再发出sql, 而是从二级缓存获取数据----"); Monster monster2 = monsterMapper.getMonsterById(3); System.out.println("monster2=" + monster2); Monster monster3 = monsterMapper.getMonsterById(3); System.out.println("monster3=" + monster3); if (sqlSession != null) { sqlSession.close(); } }
注意事项和使用陷阱
理解二级缓存策略的参数
<cache eviction="FIFO" flushInterval="30000" size="360" readOnly="true"/>
上面的配置意思如下:
创建了FIFO 的策略,每隔30 秒刷新一次,最多存放360 个对象而且返回的对象被认为是只读的。
eviction:缓存的回收策略
flushInterval:时间间隔,单位是毫秒,
size:引用数目,内存大就多配置点,要记住你缓存的对象数目和你运行环境的可用内存
资源数目。默认值是1024
readOnly:true,只读
四大策略
√ LRU – 最近最少使用的:移除最长时间不被使用的对象,它是默认
√ FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
√ SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
√ WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
如何禁用二级缓存
一、修改resources\mybatis-config.xml
<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> <!--全局性地开启或关闭所有映射器配置文件中已配置的任何缓存, 默认就是true--> <setting name="cacheEnabled" value="false"/> </settings>
二、修改mapper\MonsterMapper.xml,取消缓存
<!--<cache eviction="FIFO" flushInterval="30000" size="360" readOnly="true"/>-->
三、或者更加细粒度的, 在配置方法上指定useCache=“false”
设置useCache=false 可以禁用当前select 语句的二级缓存,即每次查询都会发出sql 去查询,默认情况是true,即该sql 使用二级缓存。
注意:一般我们不需要去修改,使用默认的即可。
mybatis 刷新二级缓存的设置
可以在实现方法上配置刷新缓存:flushCache=“true”
<update id="updateMonster" parameterType="Monster" flushCache="true"> UPDATE mybatis_monster SET NAME=#{name},age=#{age} WHERE id=#{id} </update>
insert、update、delete 操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。
默认为true,默认情况下为true 即刷新缓存,一般不用修改。