Mybatis缓存
缓存
简介
- 什么是缓存?
- 存在内存中的临时数据
- 将用户经常查询的用户放在缓存中,查询时就可从缓存中查询而不查询数据库,提高了查询效率,解决了高并发系统性能问题
- 使用缓存的目的?
- 减少与数据库交互次数,减少系统开销,提高系统效率
- 什么样的数据适合使用缓存?
- 经常查询且不经常改变的数据
Mybatis缓存
- Mybatis包含一个非常强大的查询缓存的特性,可以定制和配置缓存
- 默认定义了一级缓存和二级缓存
- 默认情况下只有一级缓存开启(SqlSession级别,也称为本地缓存)
- 二级缓存需要手动开启和配置,基于namespace级别的缓存
- Mybatis定义了缓存接口Cache,可以用来自定义二级缓存
一级缓存
一级缓存也称为本地缓存:
- 与数据库同一次会话期间查到的数据存在本地缓存中
- 后续查询相同数据时,从缓存中获取而不查询数据库
注意:
- 每个SqlSession中的缓存互相独立
- 执行增删改操作将会清除缓存,因为数据可能已经改变
- 可使用
session.clearCache()
手动清除缓存
二级缓存
-
二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
-
基于namespace级别的缓存,一个命名空间对应一个二级缓存
-
工作机制
- 会话查询数据时会将数据放在该会话的一级缓存中
- 当会话关闭后,一级缓存中的数据存到二级缓存中
- 新的会话即可从二级缓存中获取内容
-
开启方式
- Mapper.xml中加入
<cache>
开启二级缓存 - cache可以修改属性
- eviction: 清除策略 默认为LRU
- LRU:最近最少使用:移除最长时间不使用的对象
- FIFO:先进先出:按对象进入缓存的顺序来移除它们
- SOFT:软引用:基于垃圾回收器状态和软引用规则移除对象
- WEAK:弱引用:更积极地基于垃圾收集器状态和弱引用规则
- flushInterval: 刷新间隔,属性可被设置成任意正整数设置的值应该是一个以毫秒为单位的合理时间量。 默认情况是不设置,也就是没有刷新间隔,缓存仅仅会在调用语句时刷新
- size:引用数目 属性可以被设置为任意正整数,要注意欲缓存对象的大小和运行环境中可用的内存资源。默认值是 1024
- readOnly: 只读 只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false
- eviction: 清除策略 默认为LRU
- Mapper.xml中加入