欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

怎樣提高mybatis-plus中saveBatch方法的效率

 更新時間:2023年07月14日 10:57:38   作者:草履蟲稽亞娜  
這篇文章主要介紹了怎樣提高mybatis-plus中saveBatch方法的效率問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

提高mybatis-plus中saveBatch方法的效率

MyBatis-Plus中的saveBatch方法是一個很方便的批量插入數(shù)據(jù)的方法,但是如果插入的數(shù)據(jù)量很大時,可能會出現(xiàn)效率較低的情況。

提高saveBatch方法效率的方法

1.批量插入的數(shù)據(jù)量不宜過大,否則可能會導(dǎo)致內(nèi)存溢出。建議根據(jù)實際情況選擇合適的批量插入數(shù)據(jù)的數(shù)量。

2.如果插入的數(shù)據(jù)是從文件或其他數(shù)據(jù)源中讀取的,可以使用流式插入的方式,將數(shù)據(jù)流分批插入數(shù)據(jù)庫,可以減小內(nèi)存壓力。

3.在執(zhí)行saveBatch方法前,可以通過開啟MyBatis-Plus的批量插入功能,將多條SQL語句合并成一條執(zhí)行,減少與數(shù)據(jù)庫的交互次數(shù)。可以通過以下代碼開啟批

mybatis-plus saveOrUpdateBatch踩坑

mybatis-plus版本: 3.5.1

調(diào)用方法

@Transactional(rollbackFor = Exception.class) ?
default boolean saveOrUpdateBatch(Collection<T> entityList) { ?
? ? return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE); ?
}

問題說明

當對entityList進行批量更新操作時,方法內(nèi)部會根據(jù)主鍵查詢該記錄,導(dǎo)致批量更新操作十分緩慢,具體代碼如下

@Transactional(rollbackFor = Exception.class)
@Override
public boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize) {
? ? TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass);
? ? Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");
? ? String keyProperty = tableInfo.getKeyProperty();
? ? Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");
? ? return SqlHelper.saveOrUpdateBatch(this.entityClass, this.mapperClass, this.log, entityList, batchSize, (sqlSession, entity) -> {
? ? ? ? Object idVal = tableInfo.getPropertyValue(entity, keyProperty);
? ? ? ? // 當主鍵存在時,會執(zhí)行sqlSession.selectList(getSqlStatement(SqlMethod.SELECT_BY_ID), entity)查詢該條記錄
? ? ? ? return StringUtils.checkValNull(idVal) || CollectionUtils.isEmpty(sqlSession.selectList(getSqlStatement(SqlMethod.SELECT_BY_ID), entity));
? ? }, (sqlSession, entity) -> {
? ? ? ? MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();
? ? ? ? param.put(Constants.ENTITY, entity);
? ? ? ? sqlSession.update(getSqlStatement(SqlMethod.UPDATE_BY_ID), param);
? ? });
}
public static <E> boolean saveOrUpdateBatch(Class<?> entityClass, Class<?> mapper, Log log, Collection<E> list, int batchSize, BiPredicate<SqlSession, E> predicate, BiConsumer<SqlSession, E> consumer) {
?? ?String sqlStatement = getSqlStatement(mapper, SqlMethod.INSERT_ONE);
?? ?return executeBatch(entityClass, log, list, batchSize, (sqlSession, entity) -> {
?? ??? ?// 執(zhí)行predicate
?? ??? ?if (predicate.test(sqlSession, entity)) {
?? ??? ??? ?sqlSession.insert(sqlStatement, entity);
?? ??? ?} else {
?? ??? ??? ?consumer.accept(sqlSession, entity);
?? ??? ?}
?? ?});
}
public static <E> boolean executeBatch(Class<?> entityClass, Log log, Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {
?? ?Assert.isFalse(batchSize < 1, "batchSize must not be less than one");
?? ?return !CollectionUtils.isEmpty(list) && executeBatch(entityClass, log, sqlSession -> {
?? ??? ?int size = list.size();
?? ??? ?int idxLimit = Math.min(batchSize, size);
?? ??? ?int i = 1;
?? ??? ?for (E element : list) {
?? ??? ??? ?// 循環(huán)每條記錄,執(zhí)行consumer,在此次調(diào)用中,consumer中會執(zhí)行predicate,當該條記錄主鍵不為空時,會通過主鍵查詢該記錄
?? ??? ??? ?consumer.accept(sqlSession, element);
?? ??? ??? ?if (i == idxLimit) {
?? ??? ??? ??? ?sqlSession.flushStatements();
?? ??? ??? ??? ?idxLimit = Math.min(idxLimit + batchSize, size);
?? ??? ??? ?}
?? ??? ??? ?i++;
?? ??? ?}
?? ?});
}

總結(jié)

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

相關(guān)文章

  • MyBatis 使用權(quán)威指南

    MyBatis 使用權(quán)威指南

    MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集,本文給大家介紹MyBatis 使用指南,一起看看吧
    2017-03-03
  • Java中創(chuàng)建對象的5種方式總結(jié)

    Java中創(chuàng)建對象的5種方式總結(jié)

    本篇文章主要介紹了Java中創(chuàng)建對象的5種方式總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • SpringBoot自動裝配原理詳細解析

    SpringBoot自動裝配原理詳細解析

    這篇文章主要介紹了SpringBoot自動裝配原理詳細解析,一個對象交給Spring來管理的三種方式 @Bean @Compoment @Import,
    @Bean主要在@Configuration中,通過方法進行注入相關(guān)的Bean,@Compoent與@Service歸為一類,在類上加注入對應(yīng)的類,需要的朋友可以參考下
    2024-01-01
  • SpringBoot 二維碼生成base64并上傳OSS的實現(xiàn)示例

    SpringBoot 二維碼生成base64并上傳OSS的實現(xiàn)示例

    本文主要介紹了SpringBoot 二維碼生成base64并上傳OSS的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Java中Map.merge()方法使用示例詳解

    Java中Map.merge()方法使用示例詳解

    這篇文章主要介紹了Map.merge()方法使用和介紹,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 淺談異常結(jié)構(gòu)圖、編譯期異常和運行期異常的區(qū)別

    淺談異常結(jié)構(gòu)圖、編譯期異常和運行期異常的區(qū)別

    下面小編就為大家?guī)硪黄獪\談異常結(jié)構(gòu)圖、編譯期異常和運行期異常的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Java SPI機制詳細介紹

    Java SPI機制詳細介紹

    大家好,本篇文章主要講的是Java SPI機制詳細介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Java?多個時間區(qū)間進行合并處理方法

    Java?多個時間區(qū)間進行合并處理方法

    用戶在選擇多個時間區(qū)間之后,如選擇的時間區(qū)間連續(xù)或者有重疊,需要對所選的時間區(qū)間進行合并,這其實是一個區(qū)間合并問題,下面通過本文給大家介紹Java?多個時間區(qū)間進行合并處理的解決方案,一起看看吧
    2024-02-02
  • 如何在yml配置文件中使用中文注解

    如何在yml配置文件中使用中文注解

    這篇文章主要介紹了如何在yml配置文件中使用中文注解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • SpringBoot中的@FeignClient注解使用

    SpringBoot中的@FeignClient注解使用

    文章主要介紹了SpringCloud中的@FeignClient注解的使用及其參數(shù)詳解,包括value/name、url、path、configuration、fallback/fallbackFactory、contextId等,通過@FeignClient注解,可以方便地聲明一個REST客戶端,并定義與目標服務(wù)通信的接口
    2024-11-11

最新評論