如何控制mybatis的localCache?

问题描述 投票:0回答:1

我在我的项目中使用 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>

有效!!!

mybatis
1个回答
2
投票

默认情况下,localSessionScope 是 session - 因此,如果您调用两次或 N 次直到会话中的缓存被清除,它会返回相同的值。

如果将 localSessionScope 设置为 STATEMENT。每次返回新的下一个值。

localCacheScope=STATEMENT

另一种方法是清除缓存 - (确保性能是否正常),在第一次调用后 - 通过调用

clearCache()

请参阅此处了解完整详细信息 - MyBatis 文档

© www.soinside.com 2019 - 2024. All rights reserved.