关于xxxxxxRepository.search()方法一个分页的小陷阱

背景介绍:

我有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条数据。故而就会出现上面那种情况。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值