文章目录
- 一级缓存
- 一级缓存如何关闭
- 方法1 注解形式 可指定仅仅某个Mapper关闭注解
- 方法2 传入随机数
- 方法3 设置 statementType
- 方法4 设置 flushCache
- 方法5 全局设置 localCacheScope
- MyBatis二级缓存
- 二级缓存开启方法
- 二级缓存的配置详解
一级缓存
- 在
同一个SqlSession
中, 执行同样的sql语句, 第一次会查询, 第二次不会查询而是直接从缓存中提取, 除非中间有提交的操作. - MyBatis的一级患处是
默认开启
, 缓存范围是SqlSession会话
. - 一级缓存可能会导致
脏读
问题, 根据实际情况是否使用一级缓存.
一级缓存如何关闭
方法1 注解形式 可指定仅仅某个Mapper关闭注解
@Options(flushCache = Options.FlushCachePolicy.TRUE)
@Select("select * from ge_jdbc_datasource where id = #{id,jdbcType=BIGINT} and status = 1")
@ResultMap("resultMap")
JdbcDataSource find(Long id);
方法2 传入随机数
select id from ge_jdbc_datasource where id = 1 and STATUS = 1 AND #{randnum}=#{randnum}
方法3 设置 statementType
在mapper 的 select 标签中设置 statementType=STATEMENT
statementType的设置有3种:
-
STATEMENT
:直接操作sql,不进行预编译,获取数据 -
PREPARED
:(默认)预处理,参数,进行预编译,获取数据 -
CALLABLE
:执行存储过程————CallableStatement
方法4 设置 flushCache
在 mapper 的 select 标签中设置 flushCache=“true”
方法5 全局设置 localCacheScope
全局设置 localCacheScope=STATEMENT
MyBatis二级缓存
- 二级缓存
手动开启
, 属于范围Mapper Namespace
- 二级缓存开启后
默认所有操作都使用缓存
- 写操作commit提交时对该
namespace缓存强制清空
- select标签中配置
useCache=false
可以不用缓存,useCache=true
使用缓存 - 标签里配置
flushCache=true
代表强制清空缓存
二级缓存开启方法
<configuration>
<settings>
<!-- 二级缓存开启 -->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
mapper中配置
<mapper namespace="com.scy.springcloud.dao.PaymentDao">
<!-- 开启二级缓存 -->
<cache eviction="LRU" flushInterval="20000" readOnly="true" size="1024">
</cache>
</mapper>
二级缓存的配置详解
eviction是缓存的清除策略
1.LRU - 最近最久未使用:移除
最长时间不被使用的对象
.
2.FIFO -先进先出
:按对象进入缓存的顺序来移除它们.
3.SOFT -软引用
:移除基于垃圾收集器状态和软引用规则的对象.
4.WEAK -弱应用
:更积极的移除基于垃圾收集器状态和弱引用规则的对象.
flushInterval
flushInteval 代表
间隔多长时间自动清空缓存
, 单位毫秒
, 600000毫秒=10分钟
size
缓存存储上线, 用于保存
对象或集合(1个集合算1个对象)
的数量上限
readOnly
设置为true, 代表返回只读缓存, 每次从缓存取出的是
缓存对象本身. 这种执行效率较高
设置为false, 代表每次取出的是缓存对象的"副本
", 每一次取出的对象都是不同的, 这种安全性较高