MyBatis 记录一: 缓存
05 Nov 2016基于 v3.4.1
MyBatis 缓存分为 local cache 和 2nd level cache. 前者是在 SqlSession
级别缓存,
后者是在 Maprer
级别进行缓存. 是否开启缓存可以通过在配置中设置 cacheEnabled
(默认是开启的).
Local Cache
如果开启了缓存, 那么默认使用的是 local cache, 作用域是 SESSION
, 即同一个 session 中 MyBatis 会对所有的查询缓存.
SELECT
, UPDATE
, INSERT
, DELETE
语句都支持 flushCache
配置, 如果为 true
, 那么语句执行完毕 MyBatis
会清空缓存. SELECT
的 flushCache
默认关闭, 其他语句都默认打开.
作用域可以通过配置 localCacheScope
来调整, 另一个作用域是 STATEMENT
. 在这一作用域下,
MyBatis 只会为每一次的调用使用缓存. 难道一次调用不就是一条 SQL 语句么, 那缓存有什么用?
MyBatis 的一次调用可能不止一条 SQL 语句的, 因为 ResultMap 支持 association 和 collection,
这两者都可能触发多次 SQL.
2nd Level Cache
2nd level cache 的使用和 local cache 是一样的, 只是它默认是关闭. 需要手动开启, 在 Mapper.xml
中添加:
<cache />
如果是 Java, 可以使用 @CacheNamespace
来开启:
@CacheNamespace
public interface Mapper {
}
被缓存的对象需要实现 Serializable
接口.
2nd level cache 还可以配置替换算法 (eviction
), 刷新时间 (flushInterval
, 毫秒为单位) 等属性
通过 cache-ref
可以多个 mapper 使用同一个缓存.
ps. 测试缓存是否生效可以在一次请求之后修改下数据库中的数据, 再请求下看下数据有没有变化, 如果没变就说明缓存生效了.