在MyBatis框架中为了减轻数据库的压力,它设计了一系列的缓存组件,并且在调用sql时也会将结果进行缓存,本文主要介绍缓存在MyBatis框架中的应用。
1.缓存组件

MyBatis中有一个缓存接口定义了一些缓存的操作,存入、获取、删除等等。它有一些实现类,它的基本实现类是PerpetualCache,这里面通过一个HashMap集合对缓存进行存储,其它的实现类大多是基于这个基本实现的装饰,例如TransactionalCache在缓存基础功能上实现了事务,在存放缓存时并不直接存入,而是等提交时才会真正存入,这些实现类都有各自的侧重点,通过装饰器的模式对PerpetualCache进行了功能上的增强。
2.一级缓存
一级缓存是MyBatis框架默认开启的,是SqlSession级别的,我们知道在执行sql时候MyBatis框架是交给Executor来执行的,而Executor接口的实现基类BaseExecutor其中就实现了缓存操作,其内部有一个成员变量localCache用来存储缓存,在查询时就会先从localCache中进行查找,如果没有的话再去数据库查。

在查数据库时会将查询结果放入缓存中,这里有一个占位的操作,目的是为了防止并发。

另外还要说明一下一级缓存中key的组成,MyBatis 对于其 Key 的生成采取规则为:[mappedStementId + offset + limit + SQL + queryParams + environment]生成一个哈希码
3.二级缓存
二级缓存默认是不开启的,可以通过配置开启,它是全局级别的,开启二级缓存后,会使用 CachingExecutor 装饰 Executor,进入一级缓存的查询流程前,先在 CachingExecutor 进行二级缓存的查询。我们可以看下CachingExecutor中的实现。
CachingExecutor 同样用到了装饰器模式,在CachingExecutor有两个成员变量,delegate被装饰的执行器,tcm事务缓存管理器,TransactionCacheManager用来管理 TransactionalCache缓存,前面我们提到过它可以实现事务的操作,在执行put或remove等操作时它会将这次的key和数据存放到一个待提交的Map中,待事务提交时再真正执行,而TransactionCacheManager将事务的提交操作交给了CachingExecutor来执行,确保了数据的一致性。


MyBatis框架通过缓存组件减轻数据库压力,包括一级缓存(SqlSession级别,默认开启)和二级缓存(全局级别,可配置开启)。一级缓存由BaseExecutor中的localCache实现,查询时先查找缓存,无结果时执行SQL并存入缓存。二级缓存由CachingExecutor装饰Executor实现,事务提交时确保数据一致性。
7万+

被折叠的 条评论
为什么被折叠?



