0%

MyBatis缓存

一级缓存

缓存介绍

MyBatis中使用缓存来提高其性能。当查询数据时, 会先从缓存中取出数据,如果缓存中没有,再到数据库当中查询,MyBatis中的缓存分为两种:一级缓存和二级缓存,一级缓存是sqlSession级别的,二级缓存是mapper级别的。

一级缓存

本地缓存 (默认开启),在sqlSession没有关闭之前,再去查询时, 会从缓存当中取出数据,不会重新发送新的sql。

一级缓存失效

如果在查询之前,执行了增\删\改 缓存就会失效,手动清空缓存,如果两次的查询条件不一样,缓存也会失效
如果两个查询在不同的sqlsession当中。

二级缓存

二级缓存介绍

全局作用域缓存一个 namespace 对应一个缓存,如果会话关闭,一级缓存的数据会被保存到二级缓存中,不同namespace查出的数据 ,会放到自己对应的缓存中,现在默认也是打开的。

二级缓存使用步骤

1.确保在配置文件当中开启二级缓存

2.在对应的 mapper 中添加 cache 标签

eviction:回收策略

flushInterval:刷新间隔,默认不清空

readOnly:是否只读,true 告诉Mybatis是只读操作,不去修改数据,Mybatis 为了加快获取速度,会直接将缓存的引用将给用, 不安全, 速度快,false 非只读,有可能修改数据,Mybatis 会利用序列化和反序列化复制一份给你 速度慢些

size:可以存放多少个元素

type:可以用来指定自定义的缓存

3.POJO需要实现Serializable接口

注意事项

查询的数据都会先放到一级缓存当中,只有会话关闭,一级缓存中的数据才会转称到二级缓存中

缓存相关属性

cacheEnabled

只能控制二级缓存的开关

select中useCache

控制的也是二级缓存是否使用

增删改标签中flushCache

一级和二级都会被清空,增删改 flushCache 默认为 true,查询flushCache默认为false

sqlSession.clearCache()

只清除当前session的一级缓存

localCacheScope

本地缓存作用域

取值:SESSION、STATEMENT

STATEMENT 可以使用它禁用缓存

缓存使用顺序

先到二级缓存当中查找
如果二级缓存中没有,就去找一级缓存
如果一级缓存中也没有就去到数据库当中查询

↓赏一个鸡腿... 要不,半个也行↓