一级缓存
数据库是比较珍贵的资源,很容易成为整个系统的瓶颈,减少对数据库的直接访问 。使用缓存是一种比较有效的优化手段,使用缓存可以减少应用系统与数据库的网络交互、减少数据库访问次数、降低数据库的负担、降低重复创建和销毁对象等 系列开销,从而提高整个系统的性能。从另一方面来看,当数据库意外岩机时,缓存中保存的数据可以继续支持应用程序中的部分展示的功能,提高系统的可用性。
MyBatis 作为功能强大的 ORM 框架,提供了一级缓存和二级缓存。
一级缓存是会话级别的缓存,在 MyBatis 中每创建一个 SqlSession 对象,就表示开启一次数据库会话。一级缓存是默认开启的。
SqlSession 是通过 Executor 来实现缓存的。Executor 创建一个缓存对象。
缓存的生命周期和 SqlSession 的生命周期相同,也就是和 Executor 对象的生命周期相同。当调用 Executor 的 close() 方法,一级缓存就会被清空。当调用 executor,update() 对象,缓存的也会被清空。
一级缓存的管理
executor 执行 select() 查询,使用缓存过程。

二级缓存(Global Second Cache)
特征
- 二级缓存是 SqlSession 之间共享的
- 二级缓存是以 mapper.xml 的 namespace 为单位进行存储的
- 生命周期和应用程序的生命周期是一样,是一直存在的
- 一级缓存是 Session 或者 Statement 级别的缓存
开启二级缓存
- mybaits-config 文件配置, value 是 true,先决条件,其他二级缓存的配置,才会生效
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
- 各个 mapper.xml 配置的 <cache> or <cache-ref>
<cache readOnly="true"/>
<cache-ref namespace="org.apache.ibatis.domain.blog.mappers.BlogMapper"/>
- <select> 节点中的 useCache 属性,表示查询结果是否保存到二级缓存中去。
<select id="selectWithOptions" resultType="org.apache.ibatis.domain.blog.Author" flushCache="false" useCache="false">
select * from author
</select>
一级缓存和二级缓存的关系

缓存查询流程
二级缓存开启后,同一个namespace下的所有操作语句,都影响着同一个Cache,即二级缓存被多个SqlSession共享,是一个全局的变量。
当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。

自定义二级缓存实现
使用自定义缓存,修改 <cache> 标签的 type 类型
<cache type="com.domain.something.MyCustomCache"/>
网友评论