1. 預先準備有效數據單號池,經過單號拉取數據處理mongodb
單號表默認爲1數據庫
01 使用findAndModify 更新單號表狀態爲 2 讀取單號 循環讀取100 條多線程
02 經過運單號批量查詢 Aladin_WayBillStatus 表 獲取數據優化
03 拼接 新增 SQL語句spa
04 批量提交給 Hbase線程
05 批量更新 單號表 狀態 爲 3code
方式優勢中間件
簡單粗暴,開發簡單 不超過200行代碼,應爲findAndModify 的原子性能夠部署N個節點。blog
方式缺點開發
執行效率不高,而且提高優化空間幾乎沒有,使用多線程獲取單號反而會更加耗時。
執行效率得看獲取數據的表的承受能力。
對現有數據庫照成壓力
2.預支時間段表,經過時間段刷數據。
01 使用findAndModify 隨機獲取一個時段
02 經過時間段拉取一批數據
03 拼接 新增 SQL語句
04 批量提交給 Hbase
05 批量更新 時間段表 狀態 爲 3
方式優勢
效率會比方式01 提升很多。
因爲findAndModify 能夠多節點部署。
方式缺點
每次時間段獲取的數據量都是不可控的,業務高峯期時間段數據量可能很是大,業務低峯期數據量很是小,時間段生成規則會很是麻煩
對現有數據庫照成壓力
3.經過mongodb查詢遊標掃描數據。
find查詢默認是從最舊數據開始。
_id 能夠使用 $gt 查詢 _id是有序的。
public void test_2(ObjectId o) { DBCursor s; if (o == null) { s = mt.getCollection("orderid").find(); } else { DBObject lisi = new BasicDBObject(); lisi.put("_id", new BasicDBObject("$gt", o)); s = mt.getCollection("orderid").find(lisi); } try { while (s.hasNext()) { DBObject item = s.next(); o = (ObjectId) item.get("_id"); String me = ((BasicDBObject) item).toJson(); mq.send(new Message("mgtomq", me.getBytes(RemotingHelper.DEFAULT_CHARSET))); System.out.println(o); } } catch (Exception e) { test_2(o); } }
方式優勢:
不會對數據庫照成太大壓力。
讀取的數據也是從老到新的數據。
方式缺點:
沒法部署多個節點,獲取數據和處理數據一塊兒處理效率不高。
解決方式: 經過消息中間件解耦,讀取數據,生產消息,處理數據設置每次100條消費消息。
這種讀取數據方式也是 datex 使用的,處理方式不通,可是想法差很少。
若是不須要對數據進行處理,能夠直接使用 datex