MyBatis 记录一: 缓存

基于 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 会清空缓存. SELECTflushCache 默认关闭, 其他语句都默认打开.

作用域可以通过配置 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. 测试缓存是否生效可以在一次请求之后修改下数据库中的数据, 再请求下看下数据有没有变化, 如果没变就说明缓存生效了.

Configuration

Mapper XML Files

Java API