众所周知,mybatis设计了两级缓存。
第一级是SqlSession维度的,同一个的SqlSession里面的相同查询,不会走DB,而是走SqlSession的缓存。一级缓存默认是开启的,需要注意的是,如果DB层面事务隔离级别 < RR,那么该缓存会产生和隔离级别不一样的语义(RR下的当前读也会产生问题)。
二级缓存是Application全局维度的,同样也存在上面隔离级别的问题。使用时需要特别注意:sql如果涉及到多表操作,例如多表join查询,如果join的目标表记录发生变化,缓存的的Key是sql statement和参数,一致的情况下,这里是感知不到的,仍然走缓存会导致读到脏数据。
本文介绍了MyBatis中的一级缓存和二级缓存工作原理。一级缓存作用于SqlSession级别,相同查询可避免重复执行。二级缓存则在应用全局生效,但需要注意隔离级别设置以防脏读。对于涉及多表join查询的情况,由于缓存Key由SQL语句和参数构成,若目标表数据变化,缓存可能返回旧数据。
888

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



