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