缓存
缓存分类
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集合
但是当关联的表多了之后,会出现一个表的数据更改导致所有表的数据删除问题,所以我们要修改源码,当修改特定表的数据时只删除和该表有关联的缓存数据