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

Java多線程實(shí)現(xiàn)第三方數(shù)據(jù)同步

 更新時(shí)間:2022年08月10日 15:04:31   作者:我高考零分!  
這篇文章主要為大家詳細(xì)介紹了Java多線程實(shí)現(xiàn)第三方數(shù)據(jù)同步,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Java多線程實(shí)現(xiàn)第三方數(shù)據(jù)同步的具體代碼,供大家參考,具體內(nèi)容如下

一、場景

最近的一項(xiàng)開發(fā)任務(wù)是同步第三方數(shù)據(jù),而第三方數(shù)據(jù)一般有存量數(shù)據(jù)和增量數(shù)據(jù),存量數(shù)據(jù)有100w+。在得知此需求時(shí),進(jìn)行了一定的信息檢索和工具學(xué)習(xí),提前獲取存量數(shù)據(jù)到目標(biāo)庫,再使用kettle進(jìn)行存量數(shù)據(jù)轉(zhuǎn)換;增量數(shù)據(jù)則根據(jù)業(yè)務(wù)方規(guī)定的請求時(shí)間,通過定時(shí)任務(wù)去獲取增量數(shù)據(jù)并進(jìn)行數(shù)據(jù)轉(zhuǎn)換。在數(shù)據(jù)獲取和轉(zhuǎn)換時(shí),我們應(yīng)該要記錄每一次的請求信息,便于溯源和數(shù)據(jù)對賬!!!

二、獲取數(shù)據(jù)的方式

2.1 遞歸方式

使用遞歸方式時(shí),要求數(shù)據(jù)量少,否則會(huì)出現(xiàn)棧溢出或堆溢出!!!并且遞歸方式是單線程,所以會(huì)導(dǎo)致同步速度很慢!!!

/**
?? ? * 數(shù)據(jù)同步 - 遞歸方式
?? ? * 此處存量數(shù)據(jù)只需要請求到數(shù)據(jù)并保存數(shù)據(jù)庫即可,后期通過kettle進(jìn)行轉(zhuǎn)換。
?? ? * Data為自定義實(shí)體類,這里僅做示例!!!
*/
?? ?private void fetchAndSaveDB(int pageIndex, int pageSize) throws Exception {
? ? ? ? log.info("【數(shù)據(jù)同步 - 存量】,第{}次同步,", pageIndex);
? ? ? ? List<Data> datas= getDataByPage(pageIndex,pageSize);
? ? ? ? if (CollectionUtils.isNotEmpty(datas)) {
? ? ? ? ? ? dataService.saveOrUpdateBatch(datas);
? ? ? ? ? ? log.info("【數(shù)據(jù)同步 - 存量】,第{}次同步,同步成功", pageIndex);
? ? ? ? ? ? if (datas.size() < pageSize) {
? ? ? ? ? ? ? ? log.info("【數(shù)據(jù)同步 - 存量】,第{}次同步,獲取數(shù)據(jù)小于每頁獲取條數(shù),證明已全部同步完畢!!!", pageIndex);
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? ? ? // 遞歸操作-直到數(shù)據(jù)同步完畢
? ? ? ? ? ? fetchAndSaveDB(pageIndex + 1, pageSize);
? ? ? ? } else {
? ? ? ? ? ? log.info("【數(shù)據(jù)同步 - 存量】,第{}次同步,獲取數(shù)據(jù)為空,證明已全部同步完畢!!!", pageIndex);
? ? ? ? ? ? return;
? ? ? ? }
?? ?}
?? ?/**?
?? ? * 獲取分頁數(shù)據(jù),Data為自定義實(shí)體類,這里僅做示例!!!
?? ? */
? ? private List<Data> getDataByPage(int pageIndex, int pageSize) throws Exception {
? ? ?? ?//通過feign調(diào)用第三方接口獲取數(shù)據(jù)
? ? ? ? String data = dataFeignService.fetchAllData(pageSize, pageIndex);
? ? ? ? JSONObject jsonObject = JSONObject.parseObject(data);
? ? ? ? JSONArray datalist = jsonObject.getJSONArray("datalist");
? ? ? ? List<Data> datas = datalist.toJavaList(Data.class);
? ? ? ? return datas;
? ? }

2.2 多線程方式

由于遞歸方式是單線程,考慮到數(shù)據(jù)的龐大,且易造成內(nèi)存溢出,因此將遞歸更換成多線程方式,不僅避免了內(nèi)存溢出的情況,且速度大大的提升!!!

public void synAllData() {
? ? ??? ?// 定義原子變量 - 頁數(shù)
? ? ?? ?AtomicInteger pageIndex = new AtomicInteger(0);
? ? ??? ?// 創(chuàng)建線程池
? ? ??? ?ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);

? ? ? ? // 100萬數(shù)據(jù)
? ? ? ? int total = 1000000;//數(shù)據(jù)總量
? ? ? ? int times = total / 1000;
? ? ? ? if (total % 1000!= 0) {
? ? ? ? ? ? times = times + 1;
? ? ? ? }
? ? ? ? LocalDateTime beginLocalDateTime = LocalDateTime.now();
? ? ? ? log.info("【數(shù)據(jù)同步 - 存量】開始同步時(shí)間:{}", beginLocalDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
? ? ? ? for (int index = 1; index <= times; index++) {
? ? ? ? ? ? fixedThreadPool.submit(new Runnable() {
? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? public void run() {
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? multiFetchAndSaveDB(pageIndex.incrementAndGet(), 1000);
? ? ? ? ? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? ? ? ? ? log.error("并發(fā)獲取并保存數(shù)據(jù)異常:{}", e);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? });
? ? ? ? }
? ? ? ? LocalDateTime endLocalDateTime = LocalDateTime.now();
? ? ? ? log.info("【數(shù)據(jù)同步 - 存量】同步結(jié)束時(shí)間:{},總共耗時(shí):{}分鐘",
? ? ? ? ? ? ? ? endLocalDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),
? ? ? ? ? ? ? ? Duration.between(beginLocalDateTime, endLocalDateTime).toMinutes());
? ? }
?? ?/**
? ? ?* 數(shù)據(jù)同步 - 【多線程方式】
? ? ?*
? ? ?* @throws Exception
? ? ?*/
? ? private void multiFetchAndSaveDB(int pageIndex, int pageSize) throws Exception {
? ? ? ? log.info("【數(shù)據(jù)同步 - 存量】,第{}次同步,", pageIndex);
? ? ? ? List<Data> datas= getDataByPage(pageIndex, pageSize);//getDataByPage()同上2.1
? ? ? ? if (CollectionUtils.isNotEmpty(datas)) {
? ? ? ? ? ? log.info("【數(shù)據(jù)同步 - 存量】,第{}次同步,同步成功", pageIndex);
? ? ? ? ? ? if (datas.size() < pageSize) {
? ? ? ? ? ? ? ? log.info("【數(shù)據(jù)同步 - 存量】,第{}次同步,獲取數(shù)據(jù)小于每頁獲取條數(shù),證明已全部同步完畢!!!", pageIndex);
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }
? ? ? ? } else {
? ? ? ? ? ? log.info("【數(shù)據(jù)同步 - 存量】,第{}次同步,獲取數(shù)據(jù)為空,證明已全部同步完畢!!!", pageIndex);
? ? ? ? ? ? return;
? ? ? ? }

? ? }

三、增量數(shù)據(jù)如何對接

增量數(shù)據(jù)需要寫定時(shí)任務(wù),可使用Scheduled注解,并需要將增量數(shù)據(jù)存放到目標(biāo)庫中且進(jìn)行數(shù)據(jù)轉(zhuǎn)換!!!此處就不再提供代碼,可以參考上面的存量數(shù)據(jù)的方式編寫!!!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot?Web開發(fā)之請求響應(yīng)、分層解耦問題記錄

    SpringBoot?Web開發(fā)之請求響應(yīng)、分層解耦問題記錄

    在?Spring?Boot?的?Web?請求響應(yīng)處理中,Servlet?起著關(guān)鍵的作用,Servlet?是?Java?Web?開發(fā)中的基本組件,主要負(fù)責(zé)處理客戶端的請求并生成響應(yīng),這篇文章主要介紹了SpringBoot?Web開發(fā)之請求響應(yīng),分層解耦,需要的朋友可以參考下
    2024-08-08
  • 關(guān)于注解FeignClient的使用規(guī)范

    關(guān)于注解FeignClient的使用規(guī)范

    這篇文章主要介紹了關(guān)于注解FeignClient的使用規(guī)范,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringCloud FeignClient 超時(shí)設(shè)置

    SpringCloud FeignClient 超時(shí)設(shè)置

    FeignClient?默認(rèn)的超時(shí)時(shí)間可能不滿足你的需求,你可以通過幾種方式來自定義這些超時(shí)設(shè)置,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • 全網(wǎng)最新springboot整合mybatis-plus的過程

    全網(wǎng)最新springboot整合mybatis-plus的過程

    在本文中,介紹了 MyBatis-Plus 的核心功能和使用方法,包括如何配置分頁插件、編寫分頁查詢代碼、使用各種 Wrapper 構(gòu)建復(fù)雜查詢條件等,通過這些內(nèi)容,相信你已經(jīng)對 MyBatis-Plus 有了更深入的了解,并能夠在實(shí)際項(xiàng)目中靈活應(yīng)用這些功能,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • Java通過IO流輸出文件目錄的實(shí)例代碼

    Java通過IO流輸出文件目錄的實(shí)例代碼

    這篇文章主要介紹了Java通過IO流輸出文件目錄,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • MyBatis-plus報(bào)錯(cuò)Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required的解決方法

    MyBatis-plus報(bào)錯(cuò)Property ‘sqlSessionFactory‘ or 

    這篇文章主要給大家介紹了MyBatis-plus 報(bào)錯(cuò) Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required的兩種解決方法,如果遇到相同問題的朋友可以參考借鑒一下
    2023-12-12
  • java之CSV大批量數(shù)據(jù)入庫的實(shí)現(xiàn)

    java之CSV大批量數(shù)據(jù)入庫的實(shí)現(xiàn)

    本文主要介紹了java之CSV大批量數(shù)據(jù)入庫的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 如何獲取springboot打成jar后的classpath

    如何獲取springboot打成jar后的classpath

    這篇文章主要介紹了如何獲取springboot打成jar后的classpath問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • deepseek本地部署及java、python調(diào)用步驟詳解

    deepseek本地部署及java、python調(diào)用步驟詳解

    這篇文章主要介紹了如何下載和使用Ollama模型,包括安裝JDK?17及以上版本和Spring?Boot?3.3.6,配置pom文件和application.yml,創(chuàng)建Controller,以及使用Python調(diào)用模型,需要的朋友可以參考下
    2025-02-02
  • SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理

    SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理

    在我們開發(fā)SpringBoot后端服務(wù)時(shí),一般需要給前端統(tǒng)一響應(yīng)格式,本文主要介紹了SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理
    2023-05-05

最新評論

喀什市| 淮安市| 辉县市| 偃师市| 清原| 汉寿县| 苗栗县| 榆林市| 竹山县| 普格县| 辽宁省| 绵阳市| 隆德县| 临潭县| 白水县| 弥勒县| 宕昌县| 夏河县| 汉中市| 黄梅县| 汝阳县| 云龙县| 绥江县| 广西| 湘西| 双鸭山市| 桂阳县| 翼城县| 浦北县| 开远市| 东港市| 枣阳市| 昂仁县| 乌鲁木齐县| 垣曲县| 平南县| 收藏| 株洲县| 西和县| 玉屏| 彩票|