策略一
结合分片总数和当前分片,分页加载处理想要表数据,如下所示:
//分片参数
ShardingVO shardingVO = ShardingUtil.getShardingVo();
int i=0;
int pageNo=1;
//执行器数量
int total = shardingVO.getTotal();
//当前分片(下标从0开始)
int index = shardingVO.getIndex();
WearUserQuery wearUserQuery;
do{
wearUserQuery = new WearUserQuery();
//页码以分片+分片总数
wearUserQuery.setPageNo(index+pageNo);
wearUserQuery.setPageSize(20);
wearUserQuery.createCriteria().andFirstCommunicationTimeIsNotNull();
List<WearUser> wearUsers = wearUserService.selectWearUserByQuery(wearUserQuery);
i = wearUsers.size();
for (WearUser wearUser : wearUsers) {
//do something
}
//页码以分片+分片总数
pageNo+=pageNo+total;
}while(i>=20);
以上代码中的缺点:
- 增加数据库访问量,执行效率慢
- 若执行过程中某个分片宕机了,就会重复加载处理数据
策略二
每个分片一次性读取要处理的数据,根据当前分片取模处理属于各自的数据
//分片参数
ShardingVO shardingVO = ShardingUtil.getShardingVo();
WearUserQuery wearUserQuery = new WearUserQuery();
wearUserQuery.createCriteria().andFirstCommunicationTimeIsNotNull();
List<WearUser> wearUsers = wearUserService.selectWearUserByQuery(wearUserQuery);
int i = wearUsers.size();
for (int j = 0; j < i; j++) {
//对数据下标以当前分片取模选取处理
if (j % shardingVO.getTotal() == shardingVO.getIndex()) {
//do something
}
}
以上代码如果执行节点1挂了,那么执行节点1的分片,将自动转移到执行节点2或者执行节点3执行,达到分片的高并发,高可靠。
网友评论