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的一级缓存;