mybatis-210722-01—缓存
mybatis缓存机制
MyBatis系统中默认定义了两级缓存。
一级缓存和二级缓存。
1、默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启。
2、二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
3、为了提高扩展性。MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存
一级缓存
一级缓存(本地缓存):
sqlSession级别的缓存;
一级缓存是一直开启的;
相当于SQLSession中级别中的一个map
与数据库同一次会话期间查询到的数据会放在本地缓存中,
以后如果需要获取相同的数据,直接冲缓存中拿,没必要再去查询数据库
一级缓存失效情况(没有使用到当前一级缓存的情况,还需要再向数据库发出查询)
1)sqlSession不同
2)sqlSession相同,查询条件不同(当前一级缓存中还没有这个数据)
3)sqlSession相同,两次查询之间执行了 增删改 操作(因为这个“增删改”操作,可能对当前数据有影响)
4)sqlSession相同,手动清除了一级缓存
二级缓存
二级缓存(全局缓存):
基于namespace级别的缓存,一个namespace对应着一个二级缓存
工作机制:
1)一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中。
2)如果会话关闭,一级缓存中的数据会被保存到二级缓存中;
新的会话去查询信息,就可以参照二级缓存中的查。
3)不同的namespace查出的数据会放到自己对应的缓存中(map)
工作步骤:
1)开启全局二级缓存配置
<setting name="cacheEnabled" value="true"/>
2)去每个 mapper.xml中配置使用的二级缓存
<mapper namespace="com.bgy.mybatis.dao.EmployeeMapper">
<!--
eviction:
缓存的回收策略
LRU – 最近最少使用的:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
默认的是 LRU。
flushInterval:
缓存刷新间隔,
缓存多久清空一次,默认是不清空,设置毫秒值
readOnly:
缓存是否只读,默认是 == 非只读
true:只读
mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。
mybatis为了加快获取速度,直接就会将数据在缓存中的引用交给用户。
不安全,速度快。
false:非只读
mybatis认为获取的数据可能会被修改,
mybatis会利用序列化和反序列化技术,克隆一份新的数据给你。
安全,速度慢
size:
缓存存放多少个元素
type:
指定自定义缓存的全类名,
实现Cache接口即可使用
-->
<cache eviction="" flushInterval="" readOnly="" size="" type=""></cache>
</mapper>
3)POJO需要实现序列化接口
缓存相关的设置/配置:
1)全局配置环境中
<setting name="cacheEnabled" value="true"/>
true:开启缓存机制
false:关闭缓存机制(二级缓存关闭,一级缓存一直开启)
2)每个mapper.xml中select标签都有useCache="true":
true:使用缓存
false:不使用缓存(二级缓存不使用,一级缓存依旧使用)
3)每个mapper.xml中增删改标签都有,flushCache="true"
增删改执行完后就会清除缓存,
一级缓存,二级缓存都会被清空。
查询标签:flushCache默认为false
如果为true,当查询之后就会清空一级,二级缓存。
4)sqlSession.clearCache(); 只会清除当前session的一级缓存
5)localCacheScope:
本地缓存作用域
SESSION:当前会话的所有数据保存在会话缓存中
STATEMENT:可以禁用一级缓存