2017-01-12 10 views
1

我在使用postgre sql的項目中使用mybatis版本3.4.0。有一個ID列 是串行類型(自動增加主鍵列)。如何控制mybatis的localCache?

我寫的映射器的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值。

爲了解決這個問題,我改變了我的generate的聲明和實現。

接口:

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

默認情況下,localSessionScope是會話 - 因此,如果您進行兩次或N次調用,直到會話中緩存清除,它將返回相同的值。

如果將localSessionScope設置爲STATEMENT。每當新的下一個val被返回時。

localCacheScope=STATEMENT 

另一種方法是清除緩存 - (確保如果其確定的性能),第一個呼叫後 - 通過調用

clearCache() 

這裏指的完整詳細信息 - MyBatis Documentation

+0

謝謝。我的聲譽太低,所以我不能和你達成一致。抱歉! – yinmingjuncn

+0

沒問題。沒關係。 –