我在我的项目中使用 mybatis 3.4.0 版本和 postgre sql。有一个 id 列 是串行类型(自动创建主键列)。
我编写了mapper的generateId方法来获取序列值:
映射器接口:
public interface DemoTableNameMapper {
long generateId();
...
mapper.xml:
<select id="generateId" resultType="long">
SELECT nextval('"public".demo_table_name_id_seq'::regclass)
</select>
但是当我调用映射器的generateId方法两次想要获取两个ID值时,我发现我得到了相同的值!!!
然后我追踪mybatis的源码,发现是mybatis的localCache返回了之前生成的ID值。
为了解决这个问题,我更改了生成的声明和实现。
界面:
public interface DemoTableNameMapper {
/**
*
*
* As a workaround, every time call it with a random dummyid
*/
long generateId(@Param("dummyid") String dummyid);
...
mapper.xml:
<select id="generateId" resultType="long">
SELECT nextval('"public".demo_table_name_id_seq'::regclass)
WHERE #{dummyid}=#{dummyid}
</select>
我的问题是: 有没有更好的方式与mybatis的localCache交互?
我这样更改mapper.xml:
<select id="generateId" resultType="long" useCache="false" flushCache="true">
SELECT nextval('"public".demo_table_name_id_seq'::regclass)
</select>
有效!!!
默认情况下,localSessionScope 是 session - 因此,如果您调用两次或 N 次直到会话中的缓存被清除,它会返回相同的值。
如果将 localSessionScope 设置为 STATEMENT。每次返回新的下一个值。
localCacheScope=STATEMENT
另一种方法是清除缓存 - (确保性能是否正常),在第一次调用后 - 通过调用
clearCache()
请参阅此处了解完整详细信息 - MyBatis 文档