YON CISE

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

Configuration

Mapper XML Files

Java API