Mybatis一二级缓存实现原理与使用指南,绝了

这篇博客深入探讨了Mybatis的一级缓存和二级缓存的实现原理及使用方法。从CacheKey的生成到CachingExecutor的query方法,解析了如何从缓存中获取数据以及何时从数据库查询。文章详细介绍了二级缓存的创建,包括MappedStatement的cache属性、cache标签解析和cacheRef的使用。同时,讲解了一级缓存的查询逻辑,强调了SimpleExecutor在一级缓存中的角色。最后,讨论了数据更新时一二级缓存的刷新策略,并给出了Mybatis缓存作用的序列图。
摘要由CSDN通过智能技术生成

CacheKey cacheKey = new CacheKey();

cacheKey.update(ms.getId());

cacheKey.update(rowBounds.getOffset());

cacheKey.update(rowBounds.getLimit());

cacheKey.update(boundSql.getSql());

List parameterMappings = boundSql.getParameterMappings();

TypeHandlerRegistry typeHandlerRegistry = ms.getConfiguration().getTypeHandlerRegistry();

// mimic DefaultParameterHandler logic

for (ParameterMapping parameterMapping : parameterMappings) {

if (parameterMapping.getMode() != ParameterMode.OUT) {

Object value;

String propertyName = parameterMapping.getProperty();

if (boundSql.hasAdditionalParameter(propertyName)) {

value = boundSql.getAdditionalParameter(propertyName);

} else if (parameterObject == null) {

value = null;

} else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {

value = parameterObject;

} else {

MetaObject metaObject = configuration.newMetaObject(parameterObject);

value = metaObject.getValue(propertyName);

}

cacheKey.update(value);

}

}

if (configuration.getEnvironment() != null) {

// issue #176

cacheKey.update(configuration.getEnvironment().getId());

}

return cacheKey;

}

接下来重点看CachingExecutor的另外一个query方法。

CachingExecutor#query

public List query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)

throws SQLException {

Cache cache = ms.getCache(); // @1

if (cache != null) {

flushCacheIfRequired(ms); // @2

if (ms.isUseCache() && resultHandler == null) {

ensureNoOutParams(ms, boundSql);

@SuppressWarnings(“unchecked”)

List list = (List) tcm.getObject(cache, key); // @3

if (list == null) { // @4

list = delegate. query(ms, parameterObject, rowBounds, resultHandler, key, boundSql); //@5

tcm.putObject(cache, key, list); // issue #578 and #116 // @6

}

return list;

}

}

return delegate. query(ms, parameterObject, rowBounds, resultHandler, key, boundSql); //@7

}

代码@1:获取 MappedStatement 中的 Cache cache 属性。

代码@2:如果不为空,则尝试从缓存中获取,否则直接委托给具体的执行器执行,例如 SimpleExecutor (@7)。

代码@3:尝试从缓存中根据缓存 Key 查找。

代码@4:如果从缓存中获取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值