mybatis cache无效

2018-03-27  本文已影响30人  UUID

在项目中有个地方在使用mybatis时,需要查询下一个自增序列的值,如果系统中有重复的,则获取下一个序列值。mybatis xml配置如下:

<select id="getSrcSeq" resultType="int" useCache="false">
     SELECT nextval('ag_src_key_seq')
 </select>

程序伪代码如下,如果存在,则继续获取下一个:

do {
   srcCode = srcMappingMapper.getSrcSeq();
 } while (hasSrc(srcCode));

发现当hasSrc 返回true时,继续获取下一个,然后,SRCCode并没有发生变化。正如你所见,已经关闭了该语句的cache,但是好像并没有生效。
解决方式有以下两种方法:

设置flushCache="true"

<select id="getSrcSeq" resultType="int" useCache="false" flushCache="true">
     SELECT nextval('ag_src_key_seq')
</select>

通过配置flushCache 为true 强制刷新缓存。

参数设置一个随机字符串(或者数字)

<select id="getSrcSeq" parameterType="string" resultType="int">
    SELECT nextval('ag_src_key_seq') where '200' = #{value} or 1=1
 </select>

调用的地方如下:

do {
   srcCode = srcMappingMapper.getSrcSeq(String.valueof(Math.random()));
 } while (hasSrc(srcCode));

使用这种方式能够生效的原因就是,每次参数不同,会导致mybatis刷新cache。
mybatis配置了使用缓存,那么如果参数值相同,则查询语句的结果就会被缓存。

上一篇下一篇

猜你喜欢

热点阅读