如何控制mybatis的localCache?

时间:2017-01-12 06:16:04

标签: mybatis

我在我的项目中使用mybatis版本3.4.0和postgre sql。有一个id列 是串行类型(自动递增主键列)。

我编写mapper的generateId方法来获取序列值:

mapper interface:

public interface DemoTableNameMapper {

    long generateId();
    ...

mapper.xml:

<select id="generateId" resultType="long">
    SELECT nextval('"public".demo_table_name_id_seq'::regclass)
</select>

但是当我调用mapper的generateId方法两次想获得两个ID值时,我发现我得到了相同的值!!!

然后我追溯到mybatis的源代码,我发现它是 mybatis'localCache返回之前生成的ID值。

要解决此问题,我将更改生成的声明和实现。

接口:

public interface DemoTableNameMapper {

    /**
     * 产生新的主表的ID
     * 注:因在一次事务中需多次调用,需通过混淆参数来避免命中 mybatis 的 localCache
     * @return
     */
    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>

工作!!!

1 个答案:

答案 0 :(得分:1)

默认情况下,localSessionScope是会话 - 因此,如果您在会话中清除缓存两次或N次,则会返回相同的值。

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

localCacheScope=STATEMENT

替代方法是在第一次调用后清除缓存 - (确保其性能正常) - 通过调用

clearCache()

有关详细信息,请参阅此处 - MyBatis Documentation