Mybatis源码缓存的实现

缓存

缓存分类

1.ORM(对象关系映射)框架 集成 缓存

Hibernate,Mybatis

操作缓存快,缓存分配的内存少(在一台虚拟机)

2.第三方 中间件 充当缓存(使用代理)

Redis,Memcache,自研的方式 等

内存大,但是网络开销大(通过网络连接)

Mybatis缓存分析

Mybatis缓存二层体系

一级缓存 默认开启

程序 --> 缓存 --> 数据库

一级缓存只对本SqlSession有效,变换SqlSession后不能在原有的sqlSession上获取缓存

二级缓存 (全局缓存)

开启二级缓存的步骤:

1.mybatis-config中   <setting> 的配置【可以不配置】

2.mapper文件引入二级缓存 Cache --> Cache标签

3.查询<select userCache 属性【可以不配置】

4.事务存在

CachingExecutor的创建:

Configuration:

newExecutor()中new CachingExecutor(simpleExecutor)

Cache的创建

mybatis-config.xml --> <mapping>

xxxMapper.xml --> <cache> --> useNewCache

useNewCache:

        1.默认缓存

        

        2.创建新的实现

        Cache cache = newBaseCacheInstance(implementation, id);

        3.读取 整合<cache <property> 增加额外的参数(内置缓存不用,自定义缓存         redis,osCache,Ehcache)

        4.增加装饰器

        默认:<cache/> PerpetualCache和LruCache

        <cache blocking=""  eviction="" />

                blocking = new BlockingCache

                eviction = "FIFO" --> 默认LRUCache 替换FIFOCache

                ...

CachingExecutor 二级缓存操作时通过 MappedStatement 获取 Cache缓存


Mybatis先查询二级缓存,再查询一级缓存

Configuration --> Executor

        CachingExecutor

                tcm.getObject

                        Delegate.query(simpleExecutor的query方法)

                                BaseExecutor(lcoalCache)

                                        SimpleExecutor

二级缓存获取位置:CachingExecutor#query

一级缓存获取位置:BaseExector#query


在多表查询使用Cache时,避免脏数据的产生,需要使用<cache-ref>来关联xxxMapper.xml文件,使其共用一个Cache集合

但是当关联的表多了之后,会出现一个表的数据更改导致所有表的数据删除问题,所以我们要修改源码,当修改特定表的数据时只删除和该表有关联的缓存数据

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值