首页 > 解决方案 > PageRequest:页面值重叠

问题描述

我有一个表,必须使用分页(带批处理)来更新表中关于 prio 的记录。我必须在关于列优先级刷新的列中设置今天的日期。

id, prio, refreshed

ID = 12,HIGH,2021-11-07T12:36:09.352Z
ID = 10,HIGH,2021-11-01T12:36:09.352Z
ID = 13,HIGH,2021-11-07T12:36:09.352Z
ID = 1,HIGH,2021-09-07T12:36:09.352Z
ID = 20,HIGH,2021-09-07T12:36:09.352Z
ID = 115,HIGH,2021-09-07T12:36:09.352Z
ID = 11,HIGH,2021-11-07T12:36:09.352Z
ID = 22,LOW,2021-09-07T12:36:09.352Z
ID = 21,LOW,2021-09-07T12:36:09.352Z
ID = 2,LOW,2021-09-07T12:36:09.352Z
ID = 19,LOW,2021-09-07T12:36:09.352Z
ID = 18,LOW,2021-09-07T12:36:09.352Z
ID = 14,LOW,2021-11-07T12:36:09.352Z
ID = 15,LOW,2021-11-07T12:36:09.352Z
ID = 7,LOW,2021-11-10T12:36:09.352Z
ID = 8,LOW,2021-11-10T12:36:09.352Z
ID = 9,LOW,2021-11-10T12:36:09.352Z
ID = 3,LOW,2021-09-07T12:36:09.352Z
ID = 6,LOW,2021-09-07T12:36:09.352Z
ID = 5,LOW,2021-09-07T12:36:09.352Z
ID = 4,LOW,2021-09-07T12:36:09.352Z

为此,我有这个类的方法。

 private Flux<Long> doUpdate() {
    return Flux.<Page<DbConnection>, AtomicInteger>generate(
        () -> updatePage,
        (state, sink) -> {
          final int page = state.get();
          final Order refreshed = Order.asc("refreshed").nullsFirst();
          final Order prio = Order.asc("prio");
          PageRequest pageable = PageRequest.of(page, pageSize, Sort.by(prio));
          Page<DbConnection> all = dbConnectionRepository.sortByRefreshed(pageable);
          final Page<DbConnection> beforeUpdate = dbConnectionRepository.findAll(PageRequest.of(0, 21, Sort.by(prio)));

          for (DbConnection dbConnection : beforeUpdate) {
            LOG.info("beforeUpdate page ={}, ID = {},{},{}", page, dbConnection.getId(), dbConnection.getPrio(), dbConnection.getRefreshed());
          }

          for (DbConnection dbConnection : all) {
            LOG.info("What we need to update {}, ID = {},{},{}", page, dbConnection.getId(), dbConnection.getPrio(), dbConnection.getRefreshed());
          }

          sink.next(all);
          if (all.isLast()) {
            LOG.info("No more entries to update {} ...", page);
            sink.complete();
          }
          state.incrementAndGet();
          return state;
        })
      .doOnNext(page -> LOG.info("Starting batch {} ...", page.getNumber()))
      .doOnError(
        throwable ->
          LOG.error("Error requesting next page of dbConnection to be updated", throwable))
      .limitRate(1)
      .retry(3)
      .metrics()
      .flatMap(page -> Flux.fromStream(page.stream()))
      .metrics()
      .filter(this::updateNeeded)
      .metrics()
      .map(DbConnection::getId);
  }

它应该可以工作,但并非数据表中的所有记录都已更新...我设置 Page Size = 5,它应该从数据表中获取 5 页(表中总共有 21 条记录)。就我而言,我有 5 页,页面值重叠很奇怪。

page =: 0, ID = 12,HIGH,2021-11-07T12:36:09.352Z
page =: 0, ID = 13,HIGH,2021-11-07T12:36:09.352Z
page =: 0, ID = 10,HIGH,2021-11-01T12:36:09.352Z
page =: 0, ID = 20,HIGH,2021-09-07T12:36:09.352Z
page =: 0, ID = 1,HIGH,2021-09-07T12:36:09.352Z


page =: 1, ID = 115,HIGH,2021-09-07T12:36:09.352Z
page =: 1, ID = 1,HIGH,2021-11-14T21:21:09.229028Z
page =: 1, ID = 19,LOW,2021-09-07T12:36:09.352Z
page =: 1, ID = 18,LOW,2021-09-07T12:36:09.352Z
page =: 1, ID = 21,LOW,2021-09-07T12:36:09.352Z


page =: 2, ID = 22,LOW,2021-09-07T12:36:09.352Z
page =: 2, ID = 19,LOW,2021-11-14T21:21:20.993530Z
page =: 2, ID = 14,LOW,2021-11-07T12:36:09.352Z
page =: 2, ID = 4,LOW,2021-09-07T12:36:09.352Z
page =: 2, ID = 5,LOW,2021-09-07T12:36:09.352Z


page =: 3, ID = 3,LOW,2021-09-07T12:36:09.352Z
page =: 3, ID = 2,LOW,2021-09-07T12:36:09.352Z
page =: 3, ID = 6,LOW,2021-09-07T12:36:09.352Z
page =: 3, ID = 8,LOW,2021-11-10T12:36:09.352Z
page =: 3, ID = 5,LOW,2021-11-14T21:21:56.287378Z

page =: 4, ID = 8,LOW,2021-11-10T12:36:09.352Z

帮助查找错误,使页面中的值不重叠

标签: javapaginationoverlapbatching

解决方案


推荐阅读