我知道mybatis有缓存,默认执行update时它会刷新缓存。那么,当执行select...for更新时,它会刷新缓存吗?如果答案是否定的,那么如果我首先执行select,然后立即执行select...for更新,那么mybatis将访问数据库还是访问缓存?
发布于 2017-05-05 13:55:13
缓存刷新默认行为与实际执行的SQL无关,而是与执行的Myb提斯语句的类型有关。
无论<select>或@Select中的SQL是什么,当没有指定flushCache属性(为了注释样式而进入@Options )时,默认行为将应用:不刷新。对于<update>或@Update,默认情况下缓存是刷新的。
无论如何,在您的示例中,SELECT和SELECT FOR UPDATE是不同的strings,然后在调用这两个字符串时,数据库都会被命中,即使结果集是相同的,缓存也会将这些字符串和参数与结果关联起来。更改SQL字符串=>新命中,更改参数=>新命中。如果一个语句<select id=stmt1>和另一个语句<select id=stmt2>产生相同的string,并且使用相同的参数值调用,那么在相同的会话期间,它们之间不会发生刷新操作,那么第二个调用应该命中缓存。可以通过在mapper.namespace包上启用调试日志来检查这一点。
缓存不像ORM (Hibernate .):实体类型和主键引用的缓存。
缓存最多持续到会话结束。
在会话期间,当重复请求相同的数据(相同的语句/参数)时,不需要存储下一次使用的结果,只需再次调用语句,缓存就可以保存对DB的访问。
https://stackoverflow.com/questions/43796609
复制相似问题