当前位置: 首页 > 知识库问答 >
问题:

Spring批处理JpaPagingItemReader页大小和maxitemcount

田瀚
2023-03-14

我使用JpaPagingItemReader和Spring批处理作业从数据库中读取数据。我有一个要求,我只能写10K记录到外部服务器在每次尝试。我将块大小和页面大小设置为10000。这是否有助于在每次尝试中只读取、处理和写入10K记录,直到JpaPagingItemReader以响应null耗尽并读取来自DB的所有数据为止?我混淆了Pagesize和setMaxItemCount值。哪种方法可以确保从DB读取10K记录?

批配置步骤:

    public Step step1(StepBuilderFactory stepBuilderFactory, @Qualifier("itemReader") ItemReader<BatchRecords> ir,
            @Qualifier("itemProcessor") ItemProcessor<BatchRecords, Map<String, Object>> ip,
            @Qualifier("itemWriter") ItemWriter<Map<String, Object>> iw) throws Exception {
        logger.info("Step1");
        return stepBuilderFactory.get("step1").<BatchRecords, Map<String, Object>>chunk(10000).reader(ir).processor(ip)
                .writer(iw).build();

    }



ItemReader:

    @Bean(destroyMethod="")
    @StepScope
    public JpaPagingItemReader<BatchRecords> itemReader(){
        Map<String, Object> dates = batchUtil.dateFormat();
        String startDate = (String) dates.get("StartDate");
        String endDate = (String) dates.get("EndDate");
        logger.info("Batch settlement Start date : {}, End Date: {}",startDate,endDate);
        JpaPagingItemReader<BatchRecords> reader = new JpaPagingItemReader<BatchRecords>();
        reader.setEntityManagerFactory(localContainerdbEntityManagerFactory.getNativeEntityManagerFactory());
        reader.setQueryString("select b from BatchRecords b where b.status = 'O' and b.ordTimestamp between '" + startDate + "' and '" + endDate+ "' ");

        reader.setPageSize(10000);
//      reader.setMaxItemCount(50*reader.getPageSize());
        try {
            reader.afterPropertiesSet();
        } catch (Exception e) {
            logger.error("Exception in paging Item reader: "+e.getMessage());
        }
        return reader;

    }```

共有1个答案

糜昌胤
2023-03-14

如果要限制要读取的项总数,则需要使用maxItemCount。我认为在您的SQL查询中设置限制更好。pageSize将告诉读者每页要阅读多少项(这不是对项总数的限制,而是对请求新页时要阅读的项数的限制)。

 类似资料:
  • 我有一个使用的小型spring批处理作业。当我从命令行启动时,该作业运行良好,但当我要测试组件时,我得到一个。我不明白为什么这个工作能很好地工作,但是我不能根据文档测试它。 我只有一个简单的类,带有基本的注释。 以下是我的作业配置类: 下面是我的测试类: 问题出现在第192行的类中: 下面是来自测试执行的stacktrace: 2019-06-12 17:17:32.845-info-[main]

  • Spring批处理读取器的“pageSize”属性和写入器的“提交间隔”之间有什么关系/区别。 我可能错了,但我在我的应用程序中看到了一种模式,即每超过一个页面大小,我就会看到一个提交。这是真的吗? 谢谢

  • 我正在处理包含数据库中多个记录列表的。 我应该如何指定处理每个子列表的块大小? 感谢您的帮助,提前谢谢。

  • 我有一个Spring批处理作业,它通过SFTP从远程Linux服务器检索文件。远程服务器上的目录是一个包含七天文件(约400个文件)的存档。文件的大小相对较小。 Spring批处理知道哪些文件已经被处理。 当我启动应用程序时。第一次,Spring Batch tasklet检索文件时,Spring Batch会为它已经处理的每个文件生成一个异常: > 在Transformer类中,是否应该检查文件

  • 我正在使用Spring batch处理一个带有页眉、详细信息和页脚记录的文件。页脚包含文件中的记录总数。如果dosent的详细记录计数与页脚中的计数匹配,则不应处理该文件。

  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。