文章目录

  • 一级缓存
  • 一级缓存如何关闭
  • 方法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, 代表每次取出的是缓存对象的"副本", 每一次取出的对象都是不同的, 这种安全性较高