国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java 多線程批量更新10萬級的數(shù)據(jù)

這篇具有很好參考價值的文章主要介紹了java 多線程批量更新10萬級的數(shù)據(jù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

? ? ? ?好久沒有寫文章,今天剛好沒啥事,就動手記錄一下,好記性不如爛筆頭!言歸正傳,我最近接到的一個工作任務大概內(nèi)容是,有一張數(shù)據(jù)量在十萬+級別的表,需要新增一個字段,并且要寫入初始化值。

? ? ? ?業(yè)務其實非常的簡單,全部查詢出來一個列表,然后用mybatis的updateBatch批量更新,其實在我的實踐過程中也沒什么問題,但是執(zhí)行的效率是很低的,而且一旦數(shù)據(jù)量過大,如果機器配置不太行的話,很可能會直接OOM,如果在正式環(huán)境出現(xiàn)這個問題,那完犢子,準備刪庫跑路!

? ? ? ?所以呢,我就想了一個比較保險但是比較低級的辦法,每次查詢出5000條數(shù)據(jù),去做批量更新,確保內(nèi)存不會溢出導致服務崩盤,這當然也是可以解決問題,但是就是修復數(shù)據(jù)需要執(zhí)行很多次,顯得比較愚蠢一點。

? ? ? ?那么如何用比較方便,并且高效的方式來修復大數(shù)量的數(shù)據(jù)呢? 第一反應肯定是多線程啦,方案是:

1.查詢出全部的數(shù)據(jù)(10萬條)

2.對數(shù)據(jù)進行分批,每批5000條,

3.多線程同時處理多批數(shù)據(jù)

4.等待執(zhí)行完成,返回成功

直接上核心代碼吧,寫一個通用的分批工具類,把一個List集合,拆分成多個小的List集合

/**
 * 拆分集合
 *
 * @param <T> 泛型對象
 * @param resList 需要拆分的集合
 * @param subListLength 每個子集合的元素個數(shù)
 * @return 返回拆分后的各個集合組成的列表
 **/
public static <T> List<List<T>> splitList(List<T> resList, int subListLength) {
    if (CollectionUtils.isEmpty(resList) || subListLength <= 0) {
        return new ArrayList<>();
    }
    List<List<T>> ret = new ArrayList<>();
    int size = resList.size();
    if (size <= subListLength) {
        // 數(shù)據(jù)量不足 subListLength 指定的大小
        ret.add(resList);
    } else {
        int pre = size / subListLength;
        int last = size % subListLength;
        // 前面pre個集合,每個大小都是 subListLength 個元素
        for (int i = 0; i < pre; i++) {
            List<T> itemList = new ArrayList<>(subListLength);
            for (int j = 0; j < subListLength; j++) {
                itemList.add(resList.get(i * subListLength + j));
            }
            ret.add(itemList);
        }

        // last的進行處理
        if (last > 0) {
            List<T> itemList = new ArrayList<>(last);
            for (int i = 0; i < last; i++) {
                itemList.add(resList.get(pre * subListLength + i));
            }
            ret.add(itemList);
        }
    }
    return ret;
}
然后就是用多線程業(yè)務處理了,代碼如下
 public static void doThreadBusiness(List<String> totalList) {
        Long startTime = System.currentTimeMillis();
        System.out.println("本次更新任務開始");
        System.out.println("本機CPU核心數(shù):"+Runtime.getRuntime().availableProcessors());
        List<String> updateList = new ArrayList();
        // 初始化線程池, 參數(shù)一定要一定要一定要調好!?。。?        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 50,
                4, TimeUnit.SECONDS, new ArrayBlockingQueue(10), new ThreadPoolExecutor.DiscardPolicy());
        // 大集合拆分成N個小集合,然后用多線程去處理數(shù)據(jù),確保不會因為數(shù)據(jù)量過大導致執(zhí)行過慢
        List<List<String>> splitNList = SplitListUtils.splitList(totalList, 5000);
        // 記錄單個任務的執(zhí)行次數(shù)
        CountDownLatch countDownLatch = new CountDownLatch(splitNList.size());
        // 對拆分的集合進行批量處理, 先拆分的集合, 再多線程執(zhí)行
        for (List<String> singleList : splitNList) {
            // 線程池執(zhí)行
            threadPool.execute(new Thread(new Runnable(){
                @Override
                public void run() {
                    //模擬執(zhí)行時間
                    System.out.println("當前線程:"+Thread.currentThread().getName());
                    List<String> batchUpdateVipList = new ArrayList<>();
                    for (String str : singleList) {
                        //組裝要執(zhí)行的批量更新數(shù)據(jù)
                        batchUpdateVipList.add(str);
                    }
                    // 這里模擬執(zhí)行數(shù)據(jù)庫批量更新操作
                    System.out.println("本次批量更新數(shù)據(jù)量:"+ batchUpdateVipList.size());
                    // 任務個數(shù) - 1, 直至為0時喚醒await()
                    countDownLatch.countDown();
                }
            }));
        }
        try {
            // 讓當前線程處于阻塞狀態(tài),直到鎖存器計數(shù)為零
            countDownLatch.await();
        } catch (Exception e) {
            System.out.println("系統(tǒng)出現(xiàn)異常");
        }
        Long endTime = System.currentTimeMillis();
        Long useTime = endTime - startTime;
        System.out.println("本次更新任務結束,共計用時"+useTime+"毫秒");
    }

代碼很 簡單一看就懂了,這里要說一下CountDownLatch的使用,其實開發(fā)中并不常用,但是面試卻很常用,這里蠻寫一下,我使用CountDownLatch來阻塞主線程,等待多線程執(zhí)行完畢后,再繼續(xù)主線程,返回更新的結果,這個場景其實很經(jīng)常使用到。 如果不用CountDownLatch,主線程會馬上返回,如果是數(shù)據(jù)量大的情況下,往往會執(zhí)行蠻久的,但是結果秒返回,就會給人一種錯覺。

CountDownLatch countDownLatch = new CountDownLatch(splitNList.size());

?在線程執(zhí)行完畢后,需要調用一下countDown,

// 任務個數(shù) - 1, 直至為0時喚醒await()
countDownLatch.countDown();

在主線程用await()進行阻塞等待,這樣主線程就會一直等到所有的子線程都執(zhí)行完成了,繼續(xù)執(zhí)行主線程的后續(xù)代碼

 countDownLatch.await();

?其實這里面還有一個非常重要的面試點,就是多線程的七大參數(shù)如何設置,

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 
50,
4, 
TimeUnit.SECONDS, 
new ArrayBlockingQueue(10), 
new ThreadPoolExecutor.DiscardPolicy()
);

有興趣了解具體是設置方法可以另行查詢資料,這也是面試必問的考點。最后貼一下返回的打印結果吧,如下圖所示:

一次性執(zhí)行10萬次update,技術篇,java,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-852415.html

到了這里,關于java 多線程批量更新10萬級的數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 前端如何處理后端一次性傳來的10w條數(shù)據(jù)?

    如果你在面試中被問到這個問題,你可以用下面的內(nèi)容回答這個問題,如果你在工作中遇到這個問題,你應該先揍那個寫 API 的人。 為了方便后續(xù)測試,我們可以使用node創(chuàng)建一個簡單的服務器。 然后我們的前端由一個 HTML 文件和一個 JS 文件組成。 Index.html: Index.js: 好的,這

    2024年02月02日
    瀏覽(93)
  • java中多線程去跑海量數(shù)據(jù)使用線程池批量ThreadPoolExecutor處理的方式和使用Fork/Join框架的方式那種效率高?

    在Java中,使用線程池(ThreadPoolExecutor)和使用Fork/Join框架來處理海量數(shù)據(jù)的效率取決于具體的應用場景和需求。下面是一些需要考慮的因素: 任務類型:如果任務是CPU密集型的,那么使用Fork/Join框架可能更高效,因為它可以自動進行任務分割和并行處理。如果任務是I/O密集

    2024年02月10日
    瀏覽(21)
  • MySQL 百萬級/千萬級表 全量更新

    業(yè)務需求:今天從生成測試環(huán)境遷移了一批百萬級/千萬級表的數(shù)據(jù),領導要求將這批數(shù)據(jù)進行脫敏處理(將真實姓名 、電話、郵箱、身份證號等敏感信息進行替換)。遷移數(shù)據(jù)記錄數(shù)如下(小于百萬級的全量更新不是本文重點): 表名 表名含義 行記錄數(shù) base_house 房屋表 42

    2024年02月05日
    瀏覽(20)
  • 【工具分享】批量多目錄圖片如何轉換PDF,一次性轉換多級目錄批量的PDF的轉換,合并,輸出另存等問題

    【工具分享】批量多目錄圖片如何轉換PDF,一次性轉換多級目錄批量的PDF的轉換,合并,輸出另存等問題

    ?在工作中我們經(jīng)常要對圖片進行批量轉換PDF,由于文件量比較多,目錄比較深,工作量比較大比較耗時費力,今天我們分享的主要解決以下問題: 1、單張圖片的轉換PDF:一張圖臨時轉一下 2、多張圖片轉換成PDF:多張圖單獨轉成PDF 3、多級目錄多張圖轉換成PDF:多級目錄多

    2024年02月10日
    瀏覽(93)
  • Java8 實現(xiàn)批量插入和更新,SpringBoot實現(xiàn)批量插入和更新,Mybatis實現(xiàn)批量插入和更新

    基于mybatis實現(xiàn)的批量插入和更新 由于直接執(zhí)行批量所有數(shù)據(jù)可能會出現(xiàn)長度超出報錯問題,使用如下方式即可解決 原理還是分配執(zhí)行,這里的100就是設定每次執(zhí)行最大數(shù) 這里使用插入作為例子,也可以使用批量更新 更新的寫法

    2024年02月12日
    瀏覽(31)
  • 使用Python將圖像轉換為PDF:一次性解決您的批量轉換需求

    使用Python將圖像轉換為PDF:一次性解決您的批量轉換需求

    導語: 在數(shù)字化時代,我們經(jīng)常需要處理大量的圖像文件。將這些圖像轉換為PDF格式可以方便地存檔、分享和打印。本文將介紹如何使用Python編程語言將圖像批量轉換為PDF,并提供了一個簡單易用的圖形界面來跟蹤轉換進度。 在開始之前,請確保您已經(jīng)安裝了以下庫: PyM

    2024年02月14日
    瀏覽(90)
  • Java中處理千萬級數(shù)據(jù)的最佳實踐:性能優(yōu)化指南

    在今天的數(shù)字化時代,處理大規(guī)模數(shù)據(jù)已經(jīng)成為許多Java應用程序的核心任務。無論您是構建數(shù)據(jù)分析工具、實現(xiàn)實時監(jiān)控系統(tǒng),還是處理大規(guī)模日志文件,性能優(yōu)化都是確保應用程序能夠高效運行的關鍵因素。本指南將介紹一系列最佳實踐,幫助您在處理千萬級數(shù)據(jù)時提高

    2024年02月03日
    瀏覽(34)
  • MFC一次性開多個線程的簡單示例

    MFC一次性開多個線程的簡單示例

    為了使用mfc,先包含afxwin.h; afxwin.h是MFC C++類庫的必需文件,其中包含如CWin,CStatic,CButton,CString,CEdit等類運行所必需的頭文件;它還會調用windows.h,該頭文件包含有數(shù)據(jù)類型的定義、API入口點定義和其它有用的參數(shù)信息; Afx前綴是微軟MFC一個小組的名稱簡寫,并沒有別的

    2024年01月25日
    瀏覽(90)
  • java使用jdbcTemplate查詢并插入百萬級數(shù)據(jù)解決方案

    java使用jdbcTemplate查詢并插入百萬級數(shù)據(jù)解決方案

    背景:使用JdbcTemplate查詢500萬數(shù)據(jù),然后插入到數(shù)據(jù)庫。 這么多的數(shù)據(jù)按照普通的方式直接查詢?nèi)缓蟛迦?,服務器肯定會掛掉,我嘗試過使用分頁查詢的方式去進行分批查詢插入,雖然也能達到保證服務器不掛掉的效果,但是有一個嚴重的問題,每次查詢的數(shù)據(jù)很難保證順序

    2024年02月03日
    瀏覽(23)
  • 如何一次性更新python所有的庫?

    我們可以使用? pip ?命令來更新 Python 庫。 在命令提示符或終端中,使用pip install --upgrade后面跟上要更新的庫的名稱。 例如,如果你想更新名為? numpy ?的庫,你可以在 Windows 上打開命令提示符,在 macOS 或 Linux 上打開終端,然后輸入以下命令: 這將升級? numpy ?庫到最新版

    2024年02月09日
    瀏覽(86)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包