MyBatis/MyBatis-Plus同事務(wù)循環(huán)調(diào)用存儲過程獲取主鍵重復(fù)問題分析及解決
問題
mybatis有如下代碼獲取序列作為主鍵
IdMapper.java
@Select("SELECT TABLE.NEXTVAL FROM DUAL")
String getId();
同一事務(wù)循環(huán)調(diào)用查詢偽代碼
@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的一級緩存導(dǎo)致的。而且MyBatis默認開啟一級緩存,這樣就會導(dǎo)致循環(huán)調(diào)用查詢方法的時候,直接從緩存獲取,不會查詢數(shù)據(jù)庫,從而獲取到的數(shù)據(jù)都是緩存數(shù)據(jù)。
但請注意,并不是所有查詢都不使用一級緩存!而是當(dāng)你需要查詢的內(nèi)容是需要變化的時候才要禁用一級緩存。如:查詢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();
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Apache?SkyWalking?監(jiān)控?MySQL?Server?實戰(zhàn)解析
這篇文章主要介紹了Apache?SkyWalking?監(jiān)控?MySQL?Server?實戰(zhàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼
這篇文章主要介紹了webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼,需要的朋友可以參考下2017-04-04
java性能調(diào)優(yōu)System的gc垃圾回收方法
這篇文章主要為大家介紹了java性能調(diào)優(yōu)System的gc垃圾回收方法示例解析有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03
Spring整合redis(jedis)實現(xiàn)Session共享的過程
這篇文章主要介紹了Spring整合redis(jedis)實現(xiàn)Session共享,需要的朋友可以參考下2018-06-06
Activiti explorer.war示例工程使用過程圖解
這篇文章主要介紹了Activiti explorer.war示例工程使用過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
Spring Boot實現(xiàn)數(shù)據(jù)訪問計數(shù)器方案詳解
在Spring Boot項目中,有時需要數(shù)據(jù)訪問計數(shù)器,怎么實現(xiàn)數(shù)據(jù)訪問計數(shù)器呢?下面小編給大家?guī)砹薙pring Boot數(shù)據(jù)訪問計數(shù)器的實現(xiàn)方案,需要的朋友參考下吧2021-08-08
idea mabatisX插件生成mapper.xml文件全過程
文章介紹了如何在IntelliJ IDEA中使用MybatisX插件自動生成MyBatis的Mapper和XML文件,步驟包括安裝插件、選擇數(shù)據(jù)庫表并右鍵選擇MybatisX-Generator進行配置和生成2026-03-03

