深入理解MyBatis(一)

MyBatis的基本运行过程

  1. 输入配置文件的文件流

  2. 使用SqlSessionFactoryBuilder根据配置文件创建SqlSessionFactory

  3. 通过SqlSessionFactory获取会话SqlSession

  4. 从SqlSession获取Executor

  5. Executor读取并执行sql语句

  6. StatementHandler处理jdbc的statement交互

  7. TypeHandler负责设置参数

  8. 使用jdbc与数据库进行交互

  9. jdbc返回结果集-》TypeHandler-》ResultHandler-》StatementHandler-》Executor-》SqlSession

上述过程使用图片来描述会比较清晰。

MyBatis的缓存机制

一级缓存

Executor在Mybatis中扮演者非常重要的一个角色,除了用来控制执行sql返回结果之外,它还有一个重要的指责就是缓存的管理。

在一个SqlSession的会话中,如果使用了同样的sql以及同样的参数两次以上,那么在第二次查询的时候就会命中mybatis的一级缓存,不再次查库;

在这个session会话中,如果有进行增删改操作,那么mybatis就会刷新缓存避免脏读现象的发生;

一级缓存在Mybatis中是默认开启的。

二级缓存

二级缓存在Mybatis中其实也是默认开启的,二级缓存对应的配置项为<setting name="cacheEnabled" value="true"/> ,但是如果想要使用二级缓存需要在对应的mapper文件中加上如下配置

1
2
<!-- 开启mapper的二级缓存, type:指定cache接口的实现类,mybatis默认使用PerpetualCache 要和ehcache整合,需要配置type为ehcache实现cache接口的类型 -->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

如果不需要指定忽略type参数就可以了: <cache/>

关于二级缓存的划分:既可以每个mapper使用自己的空间,也可以多个mapper共享一个空间(使用<cache-ref namespace="xx"/>来配置)。

Mybatis对二级缓存的粒度控制很细,所以如果想要使用二级缓存,需要在指定的select标签中开启对该条语句进行缓存cacheEnabled=true

实现原理

Mybatis实现二级缓存使用了装饰器模式,使用CachingExecutor装饰了Executor;从上文我们可以知道Executor控制了一级缓存,所以我们可以发现在一二级缓存同时开启式,mybatis是会优先使用二级缓存的。

最后:关于实际应用中的缓存原则:尽量离客户端近;能用cdn的就cdn,能在nginx缓存的就在nginx缓存,接下来在控制层,业务层进行缓存,基本上在实际应用中不会使用到数据库级别的缓存。