Java兩表數(shù)據(jù)大數(shù)據(jù)量比對(duì)

使用FutureTask進(jìn)行多線程數(shù)據(jù)讀取泉沾,減少讀取時(shí)間

public void checkCompany(){

?? ??? ?//獲取數(shù)據(jù)

?? ??? ?List<CompanyVo> omsList = getOmsList();

?? ??? ?//將要比對(duì)數(shù)據(jù)放入Map

?? ??? ?Map<Long, CompanyVo> omsMap = new HashMap<Long, CompanyVo>();

?? ??? ?for(CompanyVo vo:omsList){

?? ??? ??? ?omsMap.put(vo.getIdUuid(), vo);

?? ??? ?}

?? ??? ?//比較數(shù)據(jù)

?? ??? ?compareCompany(omsMap);

??? }

每2000條數(shù)據(jù)比對(duì)一次贤旷,MySQL數(shù)據(jù)庫(kù)

public void compareCompany(Map<Long, CompanyVo> omsMap){

//獲取總數(shù)據(jù)量

? ? int count = jdbcTemplate.queryForObject("select count(1) from oms_company", Integer.class);

? ? //分頁(yè)查詢

? ? ? int pages = count%2000= 0?(count/2000):(count/2000 + 1);

? ? ? ExecutorService executor = Executors.newFixedThreadPool(10);

? ? ? for(int i = 0; i < pages; i++){

? ? ? int startIndex = i*2000;

? ? ? ProTask task = new ProTask(startIndex, omsMap);

? ? ? FutureTask future = new FutureTask(task,null);

? ? ? executor.execute(future);

? ? ? }

? ? ? executor.shutdown();

? ? ? //判斷是否比對(duì)完成

? ? ? while(true){

? ? ? if(executor.isTerminated()){

? ? ? break;

? ? ? }

? ? ? try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

? ? ? }

? ? }

獲取要比較的總數(shù)據(jù),Oracle數(shù)據(jù)庫(kù)

public List<CompanyVo> getOmsList(){

? ? List<CompanyVo> list = new ArrayList<>();

? ? int count = jdbcTemplate.queryForObject("select count(1) from TB_PUBHA", Integer.class);

? ? int pages = count%2000 == 0?(count/2000):(count/2000 + 1);

? ? ExecutorService executor = Executors.newFixedThreadPool(10);

? ? List<FutureTask<List<CompanyVo>>> futureList = new ArrayList<>();

? ? for(int i = 0; i < pages; i++){

? ? int start = i*2000 + 1;

? ? int end = (i+1)*2000;

? ? if(end > count) end = count;

? ? OmsTask task = new OmsTask(start, end);

? ? FutureTask<List<CompanyVo>> future = new FutureTask<>(task);

? ? executor.submit(future);

? ? futureList.add(future);

? ? }

? ? executor.shutdown();

? ? for(FutureTask<List<CompanyVo>> future:futureList){

? ? try {

List<CompanyVo> listq = future.get();

if(null != listq && !listq.isEmpty())

list.addAll(listq);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ExecutionException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

? ? }

? ? return list;

? ? }

OmsTask實(shí)現(xiàn)Callable接口饶辙,因?yàn)樾枰祷刂?/p>

class OmsTask implements Callable<List<CompanyVo>>{

? ? private int start;


? ? private int end;


? ? public OmsTask(int start,int end){

? ? this.start = start;

? ? this.end = end;

? ? }

@Override

public List<CompanyVo> call() throws Exception {

String sql = "select * from (select rownum rm, PUBHA_ID id_uuid,UUID company_number,PUBHA003 company_name,PUBHA005 company_address " +

? ? ? ? ? ? ? ? ? ? ",PUBHA006 post_code,PUBHA008 corporation,PUBHA009 corporation_tel,PUBHA010 manager,PUBHA011 manager_tel,PUBHA012 contract,PUBHA013 contract_tel" +

? ? ? ? ? ? ? ? ? ? ",PUBHA015 web_url from TB_PUBHA ) where rm between "+start+" and "+end;

List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);

return CompanyVo.getCompany(mapList);

}


? ? }

ProTask實(shí)現(xiàn)Runnable接口,不需要返回結(jié)果,只進(jìn)行比較

class ProTask implements Runnable{

? ? private int startIndex;

? ? private Map<Long, CompanyVo> omsMap;


? ? public ProTask(int startIndex,Map<Long, CompanyVo> omsMap){

? ? this.startIndex = startIndex;

? ? this.omsMap = omsMap;

? ? }

@Override

public void run() {

List<Map<String, Object>> listMap = jdbcTemplate.queryForList("select id_uuid,company_number,company_name,province_id,city_id,company_address,"

+ "post_code,corporation,corporation_tel,manager,manager_tel,contract,contract_tel,web_url "

+ "from oms_company limit "+startIndex+","+ 2000);

List<CompanyVo> list = CompanyVo.getCompany(listMap);

if(null != list && !list.isEmpty()){

List<Object[]> obs = new ArrayList<>();

for(CompanyVo vo:list){

CompanyVo oms = omsMap.get(vo.getIdUuid());

if(null == oms){

continue;

}

if((null == vo.getCompanyNumber() && null != oms.getCompanyNumber())

|| (null != vo.getCompanyNumber() && !vo.getCompanyNumber().equals(oms.getCompanyNumber()))){

//結(jié)果不同時(shí)進(jìn)行處理

}

//對(duì)已比對(duì)數(shù)據(jù)進(jìn)行移除

omsMap.remove(vo.getIdUuid());

}

}

}


? ? }

實(shí)體類怔檩,主要進(jìn)行查詢結(jié)果轉(zhuǎn)化

package com.digital.domain;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import com.digital.util.StringUtil;

public class CompanyVo {

private Long idUuid;

private String companyNumber;

public Long getIdUuid() {

return idUuid;

}

public void setIdUuid(Long idUuid) {

this.idUuid = idUuid;

}

public String getCompanyNumber() {

return companyNumber;

}

public void setCompanyNumber(String companyNumber) {

this.companyNumber = companyNumber;

}

public static CompanyVo getCompany(Map<String, Object> map){

if(null == map) return null;

CompanyVo vo = new CompanyVo();

String idUuid = StringUtil.ObjectToString(map.get("ID_UUID"));

if(null != idUuid)

vo.setIdUuid(Long.parseLong(idUuid));

? ? ? ? vo.setCompanyNumber(StringUtil.ObjectToString(map.get("COMPANY_NUMBER")));


return vo;

}

public static List<CompanyVo> getCompany(List<Map<String, Object>> mapList){

if(null == mapList) return null;

List<CompanyVo> list = new ArrayList<>();

for(Map<String, Object> map:mapList){

CompanyVo vo = getCompany(map);

if(null != vo)

list.add(vo);

}

return list;

}

}

————————————————

版權(quán)聲明:本文為CSDN博主「yun0000000」的原創(chuàng)文章,遵循CC 4.0 by-sa版權(quán)協(xié)議蓄诽,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明薛训。

原文鏈接:https://blog.csdn.net/yun0000000/article/details/52758098

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仑氛,隨后出現(xiàn)的幾起案子乙埃,更是在濱河造成了極大的恐慌闸英,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膊爪,死亡現(xiàn)場(chǎng)離奇詭異自阱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)米酬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門沛豌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赃额,你說我怎么就攤上這事加派。” “怎么了跳芳?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵芍锦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我飞盆,道長(zhǎng)娄琉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任吓歇,我火速辦了婚禮孽水,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘城看。我一直安慰自己女气,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布测柠。 她就那樣靜靜地躺著炼鞠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轰胁。 梳的紋絲不亂的頭發(fā)上谒主,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音软吐,去河邊找鬼瘩将。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凹耙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肠仪,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼肖抱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了异旧?” 一聲冷哼從身側(cè)響起意述,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后荤崇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拌屏,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年术荤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倚喂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓣戚,死狀恐怖端圈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情子库,我是刑警寧澤舱权,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站仑嗅,受9級(jí)特大地震影響宴倍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仓技,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一鸵贬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浑彰,春花似錦恭理、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至诉濒,卻和暖如春周伦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背未荒。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工专挪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人片排。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓寨腔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親率寡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迫卢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容