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

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

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

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

一、場景

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

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

2.1 遞歸方式

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

/**
?? ? * 數(shù)據(jù)同步 - 遞歸方式
?? ? * 此處存量數(shù)據(jù)只需要請求到數(shù)據(jù)并保存數(shù)據(jù)庫即可,后期通過kettle進行轉(zhuǎn)換。
?? ? * Data為自定義實體類,這里僅做示例!!!
*/
?? ?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為自定義實體類,這里僅做示例!!!
?? ? */
? ? 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ù)同步 - 存量】開始同步時間:{}", 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é)束時間:{},總共耗時:{}分鐘",
? ? ? ? ? ? ? ? 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ù)需要寫定時任務(wù),可使用Scheduled注解,并需要將增量數(shù)據(jù)存放到目標庫中且進行數(shù)據(jù)轉(zhuǎn)換!!!此處就不再提供代碼,可以參考上面的存量數(shù)據(jù)的方式編寫!!!

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

相關(guān)文章

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

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

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

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

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

    SpringCloud FeignClient 超時設(shè)置

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

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

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

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

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

    MyBatis-plus報錯Property ‘sqlSessionFactory‘ or 

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

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

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

    如何獲取springboot打成jar后的classpath

    這篇文章主要介紹了如何獲取springboot打成jar后的classpath問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    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ù)時,一般需要給前端統(tǒng)一響應(yīng)格式,本文主要介紹了SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理
    2023-05-05

最新評論

定西市| 阳朔县| 甘谷县| 永德县| 衡水市| 长子县| 石首市| 珠海市| 泸定县| 湾仔区| 怀柔区| 白山市| 乐安县| 大埔区| 电白县| 新泰市| 汉沽区| 宜城市| 南通市| 南华县| 胶州市| 台中县| 襄城县| 河间市| 耒阳市| 河东区| 康乐县| 江口县| 灵寿县| 安多县| 昌江| 昌乐县| 庆阳市| 荥阳市| 拉萨市| 泽州县| 禄丰县| 德昌县| 信丰县| 景德镇市| 密云县|