众所周知,mybatis设计了两级缓存。
第一级是SqlSession维度的,同一个的SqlSession里面的相同查询,不会走DB,而是走SqlSession的缓存。一级缓存默认是开启的,需要注意的是,如果DB层面事务隔离级别 < RR,那么该缓存会产生和隔离级别不一样的语义(RR下的当前读也会产生问题)。
二级缓存是Application全局维度的,同样也存在上面隔离级别的问题。使用时需要特别注意:sql如果涉及到多表操作,例如多表join查询,如果join的目标表记录发生变化,缓存的的Key是sql statement和参数,一致的情况下,这里是感知不到的,仍然走缓存会导致读到脏数据。