mybatis缓存机制

Mybatis系统中默认定义了两级缓存:一级缓存和二级缓存,默认情况下,Mybatis只会开启一级缓存,基于SqlSession级别的。二级缓存需要手动开启和配置,他是基于namespace级别的,

为了提高可扩展性,Mybatis提供了Cache接口,可以通过实现Cache接口自定义二级缓存。

一、一级缓存

1、一级缓存(即本地缓存)是基于SqlSession级别的,当Session flush或close后,该Session中的所有Cache将被清空,本地缓存不能被关闭,但可以调用clearCache()来清空本地缓存或者改变缓存的作用于,在Mybatis3.1之后,可以配置本地缓存的作用域--》在核心配置文件中settings标签中配置localCacheScope(SESSION | STATEMENT)默认为SESSION,也就是在一次会话中,STATEMENT只用在语句执行上,同一个SqlSession数据不会被共享

测试同一个SqlSession两次查询同一个对象只发了一条查询SQL,而且对象也相等

2、一级缓存失效的四种方式

1)同一个SqlSession条件不一样

2)不同的SqlSession

3)同一个SqlSession两次查询之间执行了增删改操作

4)两次查询之间执行了clearCache() 清理了缓存

二、二级缓存

也称为全局缓存,基于namespace级别的缓存:一个namespace对应一个二级缓存

工作机制:

1)、一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中;

2)、如果会话关闭,一级缓存中的数据会被保存到二级缓存中,新的会话查询息可

以参照二级缓存中的数据;

3)、不同的namesapce查出的数据会放在自己对应的缓存中(Map)

查出的数据都会默认先放在一级缓存中

只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓中

二级缓存的使用:

1)、开启全局二级缓存配置:<setting name="cacheEnabled" value="true"/>

2)、去mapper.xml中配置使用二级缓存:<cache></cache>

cache的配置信息

1、 eviction=“FIFO”: 缓存回收策略:

• LRU – 最近最少使用的:移除最长时间不被使用的对象。

• FIFO – 先进先出:按对象进入缓存的顺序来移除它们。

• SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

• WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

• 默认的是 LRU。

2、 flushInterval: 刷新间隔,单位毫秒

• 默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

3、 size: 引用数目,正整数

• 代表缓存最多可以存储多少个对象,太大容易导致内存溢出

4、 readOnly: 只读, true/false

• true:只读缓存;会给所有调用者返回缓存对象的相同实例。 因此这些对象

不能被修改。这提供了很重要的性能优势。

• false:读写缓存; 会返回缓存对象的拷贝(通过序列化)。这会慢一些,

但是安全,因此默认是 false。

3)、pojo需要实现序列化接口

三、缓存中的配置

1、(setting)cacheEnabled:true:开启二级缓存, false:关闭二级缓存 一级缓存仍然使用

2、每个select标签都有一个useCache:默认为true 使用缓存, false:不使用二级缓存,一级缓

存仍然使用

3、增删改标签都有一个flushCache:默认为true 刷新缓存测试:《《***一级二级都会都清

空***》》

select标签中的flushCache默认为false,如果设置为true每次查询之后都会清空缓存

4、sqlSession.clearCache():只是清除当前session的一级缓存;

原文地址:https://www.cnblogs.com/rzbwyj/p/11671242.html