我知道mybatis有缓存,默认情况下执行更新时会刷新缓存。那么在执行select ... for update时它是否刷新缓存?如果答案为否,那么如果我首先执行select,然后立即执行select ... for update,mybatis将访问数据库或点击缓存?
答案 0 :(得分:1)
缓存刷新默认行为与实际执行的SQL无关,而与执行的 Mybatis 语句类型无关。
无论<select>
或@Select
中的SQL是什么,然后未指定flushCache
属性(注释样式为@Options
),默认行为适用:无刷新。并且默认情况下刷新<update>
或@Update
缓存。
无论如何,在你的情况下,SELECT
和SELECT FOR UPDATE
是不同的SQL字符串,然后在调用它们时,两个数据库都将被命中,即使结果集相同,缓存也会关联SQL字符串和结果的参数。更改SQL字符串=&gt;新命中,更改参数=&gt;新的热门。如果语句<select id=stmt1>
和另一个语句<select id=stmt2>
生成相同的SQL字符串并且使用相同的参数值调用,则在同一会话期间并且它们之间不会发生刷新操作,则第二个调用应该到达缓存。可以通过在mapper.namespace包上启用调试日志来检查这一点。
缓存不像ORM(Hibernate ..)那样工作:实体类型和主键引用的缓存。
缓存最多持续到会话结束。
在会话期间重复请求相同的数据(相同的语句/参数)很方便,不需要存储结果供下次使用,只需再次调用语句,缓存只会保存对DB的访问权限。< / p>