背景介绍:
我有20几万的数据,现在要推送给别人。这样我势必要从自己的数据库中先查出来,然后一点一点的传给对方。
所以我的思路是这样的:
20万数据,Repository自带的search方法有分页功能,我只需要传一个pageable给它,告诉它怎么分页就可以了,然后用一个for循环,循环调用这个search方法查出分页之后的数据,循环传送给对方。
我的代码如下:
Integer count = aRepository.countByIsPush(1);//计算“推送状态”=1的数据条数
Integer page; //需要推送的总数据,按每次推送100条,总共需要推送的次数
if (0 == count % 100) {
page = count / 100;
} else {
page = (count / 100) + 1;
}
for (int x = 0; x < page; x++) {
aInput.setIsPush(1);
aInput.setPage(x);
aInput.setSize(100);
aInput.setOrderSort("ASC");
Page<A> aPage = aRepository.search(aInput);
...略...
}//for
由上可看出
1. 我计算出来总共需要推送的数据量count
2.每次传100条给对方,传count条我需要传page次
3.定义了一个PageableInput (即aInput),在for循环里,根据x的变化,我每次都会改变aInput的Page值,用来告诉search方法我这次要取哪一页,然后还定义aInput的size=100,告诉search数据按每页100条数据进行切分,也定义了一个排序ASC,告诉它查出来的数据按递增排序。
这样我就可以利用for循环,以及变化的page值100条100条的取,分page次取完这20万条数据并推送给对方。
的确一切很顺利,按照想象中的步骤进行了。但却出现了隐藏的问题。
我查看数据库的时候,我发现:
id为1~100的数据推送成功了;
id为101~200的数据推送失败了;
id为201~300的数据推送成功了;
id为301~400的数据推送失败了;
id为401~500的数据推送成功了;
id为501~600的数据推送失败了;
................
这是为什么????
后来问了大佬,发现原来是我那句
aInput.setIsPush(1);
的锅。
因为我给了一个条件,每次都查询推送状态是“1”的数据。
假设我有600条数据需要推送,一开始所有数据的推送状态都是“1”,这时候,我告诉search方法,我要查出推送状态为“1”的数据,按每页100条进行切分,你给我第1页。此时search查出来的应该是全部数据600条,然后search方法把id为1~100的数据给我了,我推送完了以后推送状态改为了“0”。
这时候,进行了下一次for循环,x随着page的变化增加了,变成了2,这时候,我告诉search方法,我要查出推送状态为“1”的数据,按每页100条进行切分,你给我第2页。但是,由于id为1~100的数据我已经推送过了,推送状态也变成了0,于是在这次search中,那100条已经推送了的数据是不满足查询条件“推送状态=1”的,所有这一次search查询出来的总数据量=500,即id为101~600这500条数据,而我又告诉它我要第2页,于是,这时候他就给我id为201~300的那100条数据,而不是id为101~200的那100条数据,然后我推送了这100条数据。故而就会出现上面那种情况。