最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis/MyBatis-Plus同事務循環(huán)調用存儲過程獲取主鍵重復問題分析及解決

 更新時間:2025年09月24日 15:42:26   作者:Meta39  
MyBatis默認開啟一級緩存,同一事務中循環(huán)調用查詢方法時會重復使用緩存數(shù)據(jù),導致獲取的序列主鍵值均為1,需在需要動態(tài)數(shù)據(jù)(如Oracle序列、存儲過程主鍵)時禁用緩存,避免緩存干擾查詢結果

問題

mybatis有如下代碼獲取序列作為主鍵

IdMapper.java

    @Select("SELECT TABLE.NEXTVAL FROM DUAL")
    String getId();

同一事務循環(huán)調用查詢偽代碼

	@Transactional(rollbackFor = Exception.class)
	public QueryMedicalFeeRes queryMedicalFee(QueryMedicalFeeReq req) {
		for (Obj o : objs) {
			Long id = idMapper.getId();
			log.info("id{}",id);
		}
	}

輸出如下:id都是1

id1
id1
id1
id1

原因

因為MyBatis的一級緩存導致的。而且MyBatis默認開啟一級緩存,這樣就會導致循環(huán)調用查詢方法的時候,直接從緩存獲取,不會查詢數(shù)據(jù)庫,從而獲取到的數(shù)據(jù)都是緩存數(shù)據(jù)。

但請注意,并不是所有查詢都不使用一級緩存!而是當你需要查詢的內容是需要變化的時候才要禁用一級緩存。如:查詢Oracle的序列、查詢存儲過程獲取主鍵值等情況才需要禁用一級緩存。

解決辦法

禁用一級緩存

<select id="getId" resultType="java.lang.Long" useCache="false" flushCache="true">
    SELECT TABLE.NEXTVAL AS ID FROM DUAL
</select>
    @Select("SELECT TABLE.NEXTVAL FROM DUAL")
    @Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
    String getId();

如果是存儲過程

<select id="getId" resultType="java.lang.Long" statementType="CALLABLE" useCache="false" flushCache="true">
    {call GET_NEXT_ID(#{identity,mode=IN,jdbcType=VARCHAR},#{tableName,mode=IN,jdbcType=VARCHAR},#{count,mode=IN,jdbcType=INTEGER},#{currentNo,mode=OUT,jdbcType=INTEGER})}
</select>
```java
    @Select("{call GET_NEXT_ID(#{identity,mode=IN,jdbcType=VARCHAR},#{tableName,mode=IN,jdbcType=VARCHAR},#{count,mode=IN,jdbcType=INTEGER},#{currentNo,mode=OUT,jdbcType=INTEGER})}")
    @Options(statementType = StatementType.CALLABLE, useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
    String getId();

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論

如东县| 阳曲县| 琼海市| 株洲市| 邢台市| 富顺县| 凤冈县| 康马县| 安吉县| 崇阳县| 广州市| 道真| 通榆县| 达拉特旗| 黎平县| 万宁市| 宁陕县| 三都| 开封县| 金沙县| 贵港市| 乐昌市| 阿勒泰市| 通河县| 丁青县| 榆中县| 恩平市| 舞钢市| 峨边| 乐清市| 股票| 石阡县| 三亚市| 二手房| 开化县| 白河县| 上栗县| 阿克陶县| 龙江县| 师宗县| 化德县|