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

springboot使用ThreadPoolTaskExecutor多線程批量插入百萬級數(shù)據(jù)的實現(xiàn)方法

 更新時間:2023年02月04日 09:26:03   作者:阿啄debugIT  
這篇文章主要介紹了springboot利用ThreadPoolTaskExecutor多線程批量插入百萬級數(shù)據(jù),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

開發(fā)目的:提高百萬級數(shù)據(jù)插入效率。
采取方案:利用ThreadPoolTaskExecutor多線程批量插入。
采用技術(shù):springboot2.1.1+mybatisPlus3.0.6+swagger2.5.0+Lombok1.18.4+postgresql+ThreadPoolTaskExecutor等。

具體實現(xiàn)細(xì)節(jié)

application-dev.properties添加線程池配置信息

# 異步線程配置
# 配置核心線程數(shù)
async.executor.thread.core_pool_size = 30
# 配置最大線程數(shù)
async.executor.thread.max_pool_size = 30
# 配置隊列大小
async.executor.thread.queue_capacity = 99988
# 配置線程池中的線程的名稱前綴
async.executor.thread.name.prefix = async-importDB-

spring容器注入線程池bean對象

@Configuration
 
@EnableAsync
 
@Slf4j
 
public class ExecutorConfig {
    @Value("${async.executor.thread.core_pool_size}")
    private int corePoolSize;
    @Value("${async.executor.thread.max_pool_size}")
    private int maxPoolSize;
    @Value("${async.executor.thread.queue_capacity}")
    private int queueCapacity;
    @Value("${async.executor.thread.name.prefix}")
    private String namePrefix;
 
    @Bean(name = "asyncServiceExecutor")
    public Executor asyncServiceExecutor() {
        log.warn("start asyncServiceExecutor");
        //在這里修改
        ThreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor();
        //配置核心線程數(shù)
        executor.setCorePoolSize(corePoolSize);
        //配置最大線程數(shù)
        executor.setMaxPoolSize(maxPoolSize);
        //配置隊列大小
        executor.setQueueCapacity(queueCapacity);
        //配置線程池中的線程的名稱前綴
        executor.setThreadNamePrefix(namePrefix);
        // rejection-policy:當(dāng)pool已經(jīng)達(dá)到max size的時候,如何處理新任務(wù)
        // CALLER_RUNS:不在新線程中執(zhí)行任務(wù),而是有調(diào)用者所在的線程來執(zhí)行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //執(zhí)行初始化
        executor.initialize();
        return executor;
    }
}

創(chuàng)建異步線程 業(yè)務(wù)類

@Service
 
@Slf4j
 
public class AsyncServiceImpl implements AsyncService {
@Override
    @Async("asyncServiceExecutor")
    public void executeAsync(List<LogOutputResult> logOutputResults, LogOutputResultMapper logOutputResultMapper, CountDownLatch countDownLatch) {
        try{
            log.warn("start executeAsync");
            //異步線程要做的事情
            logOutputResultMapper.addLogOutputResultBatch(logOutputResults);
            log.warn("end executeAsync");
        }finally {
            countDownLatch.countDown();// 很關(guān)鍵, 無論上面程序是否異常必須執(zhí)行countDown,否則await無法釋放
        }
    }
}

創(chuàng)建多線程批量插入具體業(yè)務(wù)方法

@Override
    public int testMultiThread() {
        List<LogOutputResult> logOutputResults = getTestData();
        //測試每100條數(shù)據(jù)插入開一個線程
        List<List<LogOutputResult>> lists = ConvertHandler.splitList(logOutputResults, 100);
        CountDownLatch countDownLatch = new CountDownLatch(lists.size());
        for (List<LogOutputResult> listSub:lists) {
            asyncService.executeAsync(listSub, logOutputResultMapper,countDownLatch);
        }
        try {
            countDownLatch.await(); //保證之前的所有的線程都執(zhí)行完成,才會走下面的;
            // 這樣就可以在下面拿到所有線程執(zhí)行完的集合結(jié)果
        } catch (Exception e) {
            log.error("阻塞異常:"+e.getMessage());
        }
        return logOutputResults.size();
    }

模擬2000003 條數(shù)據(jù)進(jìn)行測試

多線程 測試 2000003  耗時如下:耗時1.67分鐘

本次開啟30個線程,截圖如下:

單線程測試2000003  耗時如下:耗時5.75分鐘

檢查多線程入庫的數(shù)據(jù),檢查是否存在重復(fù)入庫的問題:

根據(jù)id分組,查看是否有id重復(fù)的數(shù)據(jù),通過sql語句檢查,沒有發(fā)現(xiàn)重復(fù)入庫的問題

檢查數(shù)據(jù)完整性: 通過sql語句查詢,多線程錄入數(shù)據(jù)完整

測試結(jié)果

不同線程數(shù)測試:

總結(jié)

通過以上測試案列,同樣是導(dǎo)入2000003  條數(shù)據(jù),多線程耗時1.67分鐘,單線程耗時5.75分鐘。通過對不同線程數(shù)的測試,發(fā)現(xiàn)不是線程數(shù)越多越好,具體多少合適,網(wǎng)上有一個不成文的算法:
CPU核心數(shù)量*2 +2 個線程。
附:測試電腦配置

到此這篇關(guān)于springboot使用ThreadPoolTaskExecutor多線程批量插入百萬級數(shù)據(jù)的實現(xiàn)方法的文章就介紹到這了,更多相關(guān)springboot ThreadPoolTaskExecutor多線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決JSONObject.toJSONString()輸出null的問題

    解決JSONObject.toJSONString()輸出null的問題

    這篇文章主要介紹了解決JSONObject.toJSONString()輸出null的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java中的GC收集器詳情

    java中的GC收集器詳情

    這篇文章主要介紹了java中的GC收集器,GC(Garbage collection )指的是程序內(nèi)存管理分手動和自動,手動內(nèi)存管理,需要我們編程的時候顯式分配和釋放空間,但如果忘記釋放,會造成嚴(yán)重的內(nèi)存泄漏問題,下面文章內(nèi)容我們就來實例說明情況,需要的朋友可以參考一下
    2021-10-10
  • Spring Boot 使用Druid詳解

    Spring Boot 使用Druid詳解

    本篇文章主要介紹了Spring Boot 使用Druid配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • jvm oom排查記錄剖析

    jvm oom排查記錄剖析

    這篇文章主要為大家介紹了jvm oom排查記錄剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Springboot的spring-boot-maven-plugin導(dǎo)入失敗的解決方案

    Springboot的spring-boot-maven-plugin導(dǎo)入失敗的解決方案

    這篇文章主要介紹了Springboot的spring-boot-maven-plugin導(dǎo)入失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java編程實現(xiàn)調(diào)用com操作Word方法實例代碼

    Java編程實現(xiàn)調(diào)用com操作Word方法實例代碼

    這篇文章主要介紹了Java編程實現(xiàn)調(diào)用com操作Word方法實例代碼,代碼注釋很詳細(xì),在這里分給大家,需要的朋友可以參考下。
    2017-09-09
  • Java中@RequiredArgsConstructor注解的基本用法

    Java中@RequiredArgsConstructor注解的基本用法

    這篇文章主要介紹了Java中@RequiredArgsConstructor注解的基本用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • java實現(xiàn)簡易的五子棋游戲

    java實現(xiàn)簡易的五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡易的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 詳解spring boot mybatis全注解化

    詳解spring boot mybatis全注解化

    這篇文章主要介紹了spring boot mybatis全注解化的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • 淺談Redis在微服務(wù)架構(gòu)中的幾種應(yīng)用場景

    淺談Redis在微服務(wù)架構(gòu)中的幾種應(yīng)用場景

    本文介紹在SpringCloud中使用Redis作為Pub/Sub異步通信、緩存或主數(shù)據(jù)庫和配置服務(wù)器的三種場景應(yīng)用。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05

最新評論

平安县| 图木舒克市| 岢岚县| 绥滨县| 榆树市| 望江县| 乌什县| 扎囊县| 江阴市| 穆棱市| 长治市| 志丹县| 南溪县| 镇雄县| 安徽省| 仪陇县| 宁化县| 溧水县| 通山县| 滦平县| 华安县| 海阳市| 道孚县| 瑞丽市| 疏勒县| 中西区| 广水市| 峡江县| 沾化县| 井冈山市| 邓州市| 常熟市| 隆林| 平乡县| 怀仁县| 庄河市| 子洲县| 江门市| 鄂尔多斯市| 分宜县| 陆丰市|