深入理解MyBatis(一)
MyBatis的基本运行过程
输入配置文件的文件流
使用SqlSessionFactoryBuilder根据配置文件创建SqlSessionFactory
通过SqlSessionFactory获取会话SqlSession
从SqlSession获取Executor
Executor读取并执行sql语句
StatementHandler处理jdbc的statement交互
TypeHandler负责设置参数
使用jdbc与数据库进行交互
jdbc返回结果集-》TypeHandler-》ResultHandler-》StatementHandler-》Executor-》SqlSession
上述过程使用图片来描述会比较清晰。
MyBatis的缓存机制
一级缓存
Executor在Mybatis中扮演者非常重要的一个角色,除了用来控制执行sql返回结果之外,它还有一个重要的指责就是缓存的管理。
在一个SqlSession的会话中,如果使用了同样的sql以及同样的参数两次以上,那么在第二次查询的时候就会命中mybatis的一级缓存,不再次查库;
在这个session会话中,如果有进行增删改操作,那么mybatis就会刷新缓存避免脏读现象的发生;
一级缓存在Mybatis中是默认开启的。
二级缓存
二级缓存在Mybatis中其实也是默认开启的,二级缓存对应的配置项为<setting name="cacheEnabled" value="true"/>
,但是如果想要使用二级缓存需要在对应的mapper文件中加上如下配置
1 | <!-- 开启mapper的二级缓存, type:指定cache接口的实现类,mybatis默认使用PerpetualCache 要和ehcache整合,需要配置type为ehcache实现cache接口的类型 --> |
如果不需要指定忽略type参数就可以了: <cache/>
。
关于二级缓存的划分:既可以每个mapper使用自己的空间,也可以多个mapper共享一个空间(使用<cache-ref namespace="xx"/>
来配置)。
Mybatis对二级缓存的粒度控制很细,所以如果想要使用二级缓存,需要在指定的select标签中开启对该条语句进行缓存cacheEnabled=true
。
实现原理
Mybatis实现二级缓存使用了装饰器模式,使用CachingExecutor装饰了Executor;从上文我们可以知道Executor控制了一级缓存,所以我们可以发现在一二级缓存同时开启式,mybatis是会优先使用二级缓存的。
最后:关于实际应用中的缓存原则:尽量离客户端近;能用cdn的就cdn,能在nginx缓存的就在nginx缓存,接下来在控制层,业务层进行缓存,基本上在实际应用中不会使用到数据库级别的缓存。