1. 預先准備有效數據單號池,通過單號拉取數據處理
單號表默認為1
01 使用findAndModify 更新單號表狀態為 2 讀取單號 循環讀取100 條
02 通過運單號批量查詢 Aladin_WayBillStatus 表 獲取數據
03 拼接 新增 SQL語句
04 批量提交給 Hbase
05 批量更新 單號表 狀態 為 3
方式優點
簡單粗暴,開發簡單 不超過200行代碼,應為findAndModify 的原子性可以部署N個節點。
方式缺點
執行效率不高,並且提升優化空間幾乎沒有,使用多線程獲取單號反而會更加耗時。
執行效率得看獲取數據的表的承受能力。
對現有數據庫照成壓力
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