先从二级缓存中获取数据,如果有直接获取,如果没有进行下一步;
从一级缓存中取数据,有直接获取,如果没有进行下一步;
到数据库中进行查询,并保存到一级缓存中;
当sqlSession关闭的时候,把一级缓存中的数据保存在二级缓存中。
myBatis的二级缓存默认是不开启的。我们需要在mybatis的核心配置文件中配置setting选项 和 在Mapper的配置文件中加入cache标签
启用二缓存分两步:
1、在mybatis-config.xml中配置全局的参数
<!-- 开启二缓存 -->
<setting name="cacheEnabled" value="true" />
2.到Mapper配置文件中书写Cache标签
<cache></cache>
3、实体bean对象要实现java.io.Serializable接口
没有实现java.io.Serializable接口的错误提示:
开启缓存后运行结果:
userCache
userCache默认值是true,表示启用缓存。
如果设置useCache为false就表示不启用二级缓存,不影响一级缓存。
运行结果:
flushCache属性默认值是true,在update标签,delete标签,insert标签中有。
表示当执行插入,修改,删除语句的时候,会清空缓存。
如果设置为false,很有肯能会产生脏数据。
xml文件配置:
测试的java代码:
现在看看是否产生脏数据:
中间更新了数据为"更新了",但是接下来数据并没有读取更新后的数据,而是读取缓存中原有的数据,即脏数据。
默认的<cache/>标签的作用:
1、映射语句文件中的所有 select 语句将会被缓存。
2、射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
3、缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
4、根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
5、缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
6、缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
cache标签示例解析:
eviction 属性表示缓存策略。
LRU – 最近最少使用的:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
默认的是 LRU。
flushInterval 属性表示间隔多长时间刷新一下缓冲区,清理一下溢出的数据。以毫秒为单位。
size 属性表示缓存中可以保存多少个对象。默认是1024。
readOnly 属性表示是否只读。如果设置为true。表示缓存中只有一个对象。如果设置为false(默认)每次取出来都会反序列化拷贝一份。
type 属性表示自定义二级缓存对象。