在项目中有个地方在使用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配置了使用缓存,那么如果参数值相同,则查询语句的结果就会被缓存。
网友评论