当前位置: 首页 > 后端技术 > Java

【专访普通人VS高手系列】说说Mybatis中的缓存机制

时间:2023-04-01 23:32:33 Java

一位工作5年的程序员一直私信向我吐槽。他说自己用了这么久的Mybatis,不管怎么说对Mybatis都是熟练的。结果竟然在Mybatis的面试题上翻车了!真烦人!好了,今天就来看看《Mybatis中的缓存机制》,普通人和高手的解答。普通人:嗯。........师父:这个问题有点复杂,我打算从几个方面来解释。首先,在Mybatis中设计了一个二级缓存,以提高数据检索的效率,避免每次访问数据都需要查询数据库。一级缓存是SqlSession级缓存,也叫本地缓存,因为每个用户都需要使用SqlSession来执行查询。Mybatis为了避免每次都去查数据库,将查询到的数据保存到SqlSession的本地缓存中,如果后续的SQL命中了缓存,可以直接从本地缓存中读取。如果要实现跨SqlSession级别的缓存呢?那么一级缓存无法实现,所以在Mybatis中引入了二级缓存,即多个用户在查询数据时,只有任意一个SqlSession会把数据放入二级缓存,其他SqlSession可以加载来自二级缓存的数据。每个一级缓存的具体实现原理是:在SqlSession中持有一个Executor,每个Executor都有一个LocalCache对象。当用户发起查询时,Mybatis会根据执行语句在LocalCache中进行查询。如果没有命中,则查询数据库并写入LocalCache,否则直接返回。所以缓存的生命周期是SqlSession,在多个Sqlsession或者分布式环境下,可能会导致数据库写操作出现脏数据。二级缓存的具体实现原理是:CachingExecutor用于装饰Executor,所以在进入一级缓存的查询流程之前,二级缓存的查询都会通过CachingExecutor进行。启用二级缓存后,会被多个SqlSession共享,所以是全局缓存。所以它的查询过程是先查二级缓存,再查一级缓存,最后查数据库。另外,与一级缓存相比,MyBatis的二级缓存实现了SqlSession之间缓存数据的共享。同时缓存粒度也可以达到命名空间级别,通过Cache接口可以实现类的不同组合。它也更可控。以上是我对这个问题的理解。综上所述,在实际业务场景中,多级缓存的设计思想是非常值得学习和借鉴的。所以我觉得这个面试题挺好的。大家要牢记,学习底层技术的目的是为了提升技术思维能力,积累解决方案,为日后走上更高的岗位做铺垫。普通人VS专家访谈系列到此结束。有不懂的技术面试题,欢迎私信我。版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!