执行 select 时mybatis是否刷新缓存...默认更新?

does mybatis flush cache when execute select ... for update by default?

我知道mybatis是有缓存的,默认执行update的时候会flush cache。那么它会在执行 select... 更新时刷新缓存吗?如果不是,那么如果我先执行select,然后马上执行select...更新,mybatis会访问数据库还是命中缓存?

缓存刷新默认行为与实际执行的SQL无关,而是与执行的Mybatis语句的类型有关

无论 SQL 在 <select>@Select 中,然后 flushCache 属性 未指定(注释样式为 @Options ),默认行为适用:不冲洗。对于 <update>@Update 缓存默认刷新。

无论如何,在你的情况下,SELECTSELECT FOR UPDATE是不同的SQL字符串,那么当调用这两个字符串时,数据库都会被命中,即使结果集是同样,缓存将 SQL 字符串和参数关联到结果。更改 SQL 字符串 => 新命中,更改参数 => 新命中。如果语句 <select id=stmt1> 和另一个语句 <select id=stmt2> 产生相同的 SQL 字符串并使用相同的参数值调用,在同一会话期间并且它们之间没有发生刷新操作,那么第二次调用应该命中缓存。这可以通过在 mapper.namespace 包上启用调试日志来检查。

缓存不像在 ORM (Hibernate ..) 中那样工作:缓存由实体类型和主键引用。

缓存最多持续到会话结束。

在一个session中重复请求相同的数据(相同的statement/parameters)时很方便,下次使用不需要存储结果,只需要再次调用语句,缓存只保存一次对DB的访问结果。