首页 > 编程语言 >java陷阱之遍历数据源数据

java陷阱之遍历数据源数据

时间:2024-07-16 16:31:11浏览次数:15  
标签:遍历 java 数据源 wrapper page getRecords 偏移 pageResult PO

日常我们执行刷数更新避免使用分页偏移,如何涉及到条件变更会丢数据

比如满足条件的数据 1 2  3 4  5 6 7

根据分页偏移查询当处理第一页1 2,1 2处理后不满足条件分页指针偏移到2,这个时候条件1 2已经不满足了 就丢了3 4数据

采用id偏移的方式

针对要修改的db场景,还应该避免大事务

 

    @Override
    @Transactional(timeout = 10, propagation = Propagation.NEVER, rollbackFor = Exception.class)
    public ReturnT<String> execute(String paramStr) throws Exception {
        log.info("#22 TempAlarmOrderOrgCodeRefreshTask  任务执行计划调度 开始执行刷数,paramStr:{},开始时间:{}",
            paramStr, DateHelper.format(new Date(), DateHelper.DATETIME_FORMAT));
        LambdaQueryWrapper<PO> wrapper = Wrappers.lambdaQuery();

        // 设置查询条件:erp_org_code 为 NULL 或者为空字符串
        wrapper.and(w -> w.isNull(PO::getErpOrgCode)
            .or().eq(PO::getErpOrgCode, ""));

        // 设置排序条件:按 id 升序排序
        wrapper.orderByAsc(PO::getId);
        Page<ColdChainAlarmOrder> page = new Page<>();
        int currentPage = 1;
        int pageSize = 100;
        Long lastId = 0L;
        Long updatedTotalCount = 0L;
        Integer index = 0;
        //是否到最后一页
        boolean isLastPage = false;
        while (true) {
            //最后一页结束
            if (isLastPage) {
                break;
            }
            index++;
            page.setCurrent(currentPage);
            page.setSize(pageSize);
            //每次读取第一页,id指针偏移
            wrapper.gt(PO::getId, lastId);
            IPage<?> pageResult = mapper.selectPage(page, wrapper);
            //未查到数据 表示没有需要处理数据
            if (CollectionUtils.isEmpty(pageResult.getRecords())) {
                break;
            }
            //查询数量小于分页数量表示最后一页
            isLastPage = pageResult.getRecords().size() < pageSize;
            //获取最后一个升序的id 用于指针偏移
            lastId = pageResult.getRecords().get(pageResult.getRecords().size() - 1).getId();
            List<PO> records = pageResult.getRecords();
            List<String> storeCodes = records.stream().map(PO::getStoreCode)
                .filter(storeCode -> StringUtils.isNotBlank(storeCode)).collect(Collectors.toList());
            //需要根据门店获取,如果没有数据则忽略
            if (CollectionUtils.isEmpty(storeCodes)) {
                continue;
            }
            //走代理开启事务一批一批修改
            Integer updatedCount = applicationContext.getBean(this.getClass())
                .batchUpdateErpCode(执行修改的po);
        }
    }
    @Transactional(timeout = 10, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public Integer batchUpdateErpCode(List<PO> updateErpCodOrders) {
        
    }

 

标签:遍历,java,数据源,wrapper,page,getRecords,偏移,pageResult,PO
From: https://www.cnblogs.com/LQBlog/p/18305539

相关文章

  • 你不知道的JavaScript---强制类型转换
    你好,我是小白Coding日志,一个热爱技术的程序员。在这里,我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客,一起在技术的世界里探索前行吧!JavaScript是一种动态类型语言,这意味着变量可以在不同类型之间自由转换。在开发......
  • JavaScript字符串对象查找字符出现次数
      查找字符串中某个字符出现的次数思路:1.根据indexOf()方法的特性只会返回要查找的字符出现再字符串中的第一次的位置     2.而且想要继续往后查找则需要跳过前一个已经查询了的字符的位置,则可以在原先位置加       1后再查找     3.将......
  • Java中的日志管理与分析最佳实践
    Java中的日志管理与分析最佳实践大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在大型软件系统中,良好的日志管理与分析是确保系统稳定性和性能的关键因素。本文将深入探讨Java中的日志管理最佳实践,以及如何通过有效的日志分析提升系统的运维效率和故障排......
  • Java中的网络编程与TCP/IP协议详解
    Java中的网络编程与TCP/IP协议详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代软件开发中,理解和掌握网络编程以及TCP/IP协议是构建高性能网络应用的关键。本文将深入讨论Java中的网络编程技术和TCP/IP协议的工作原理与应用。一、网络编程基础......
  • 深入理解Java虚拟机(JVM)及其内部原理
    深入理解Java虚拟机(JVM)及其内部原理大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java开发中,了解Java虚拟机(JVM)的工作原理是非常重要的。本文将深入探讨JVM的内部结构和运行机制,帮助读者更好地理解和优化Java应用程序的性能。一、JVM的基本概念和组成......
  • Java中的数据库连接池选择与优化策略
    Java中的数据库连接池选择与优化策略大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java应用程序中,数据库连接池是提升性能和资源利用率的关键因素之一。本文将深入探讨如何选择和优化数据库连接池,以及在实际项目中的应用和注意事项。一、数据库连接池......
  • 使用Java和Redis构建高性能的缓存系统
    使用Java和Redis构建高性能的缓存系统大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代应用程序中,高性能的缓存系统对于提升系统性能和响应速度至关重要。本文将详细介绍如何利用Java和Redis构建一个高效的缓存系统,以及实现过程中的关键技术和注意事......
  • 24 年 “年薪百万” 的 Java 程序员,都要学什么?
    大家好,我是程序员鱼皮。前几天我看了一篇由国外的Java架构师大佬分享的文章,主题是“Java架构师必会的20个技术”。光看这个标题,就知道在国外做Java开发,也很卷啊!能学习的技术真的太多了。我觉得作者讲的很全面,所以总结一下分享给大家,并且专门针对国内Java程序员也要学......
  • Java突击面试八股文(就业必备)
    第一章-Java基础篇1、你是怎样理解OOP面向对象   难度系数:⭐面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征:继承:继承是从已有类得到继承信息创建新类的过程封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口多态性:多态性是指允......
  • collect 详细解析 Java 8 Stream API 中的 collect 方法
    collect详解Java8引入的StreamAPI提供了一种强大的方式来处理集合数据其中的collect方法是一个关键操作,用于将流中的元素收集到不同类型的结果容器中。本文将详细介绍Java中Stream的collect方法包括其基本用法、常见的收集器以及一些实际应用场景。......