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

Spring Boot批处理中的StoredProcedureItemReader

云宜人
2023-03-14

我正在尝试使用StoredProcedureItemReader for Cursor读取spring批处理中的一个DB2存储过程。sql字符串未被执行,默认sql被传递给jdbctemplate

    public class MyItemPreparedStatementSetter implements PreparedStatementSetter {

    @Override
    public void setValues(PreparedStatement ps) throws SQLException {

        ps.setString(1, "UH");
        ((CallableStatement) ps).registerOutParameter(2, Types.VARCHAR);
        ((CallableStatement) ps).registerOutParameter(3, Types.CHAR);
        ((CallableStatement) ps).registerOutParameter(4, Types.INTEGER);
    }

}
   @Bean
public StoredProcedureItemReader<PrintResponse> jdbcReader(JdbcTemplate jdbcTemplate) throws Exception {
    StoredProcedureItemReader<PrintResponse> storedProcedureItemReader = new StoredProcedureItemReader<>();
    SqlParameter[] parameters = {new SqlParameter("@I_PRODUCT_CDE", Types.CHAR)
            , new SqlParameter("@O_ERROR_MESSAGE", Types.VARCHAR), new SqlParameter("@O_SQLSTATE", Types.CHAR)
            ,new SqlParameter("@O_SQLCODE", Types.INTEGER)};

    storedProcedureItemReader.setFunction(true);        
    storedProcedureItemReader.setDataSource(jdbcTemplate.getDataSource());
    storedProcedureItemReader.setProcedureName("DEVTEST.PP_GETALLPRINTREADY");        
    storedProcedureItemReader.setRowMapper(new PolicyPrintResultRowMapper());
    storedProcedureItemReader.setParameters(parameters);
    storedProcedureItemReader.setPreparedStatementSetter(new MyItemPreparedStatementSetter());

    storedProcedureItemReader.setCurrentItemCount(0);

    storedProcedureItemReader.afterPropertiesSet();
    System.out.println(storedProcedureItemReader.getSql());

    return storedProcedureItemReader;       
}

我正在使用由作业调用的批处理步骤:

@Autowired
public JobBuilderFactory jobBuilderFactory;

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Autowired
@Qualifier("jdbcTemplate")
JdbcTemplate jdbcTemplate; 

    @Bean
public ItemWriter<PrintResponse> fileWriter(@Value("${output}") Resource resource) {

    LineAggregator<PrintResponse> lineAggregator = new DelimitedLineAggregator<>();
    return new FlatFileItemWriterBuilder<PolicyPrint>()
            .name("file-writer")
            .resource(resource) 
            .lineAggregator(lineAggregator)
            .build();
}

@Bean
public Job jobPrintRecord(JobBuilderFactory jobBuilderFactory, Step step1) {
    return jobBuilderFactory.get("jobPrintAll")
            .incrementer(new RunIdIncrementer())
            .start(step1)
            .build();
 }

@Bean
public Step step1() throws Exception {
    return stepBuilderFactory.get("step1")
            .<PrintResponse, PrintResponse>chunk(5)
            .reader(jdbcReader(jdbcTemplate))
            .writer(fileWriter(null))
            .build();
}
 java.lang.IllegalStateException: Failed to execute CommandLineRunner org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:797) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]   ... 5 common frames omitted

为什么我没有得到结果集或者无法执行查询。我是个新手,有点卡住了。调试显示,数据源配置正确。

谢谢!

共有1个答案

邵正雅
2023-03-14

这个问题已经解决了,我使用了Map的默认内存使用,而不是物理数据库。任何遇到相同问题的人,请重写setDatasource并使其为空,如下所示:

    public class BatchConfiguration extends DefaultBatchConfigurer
 { 
@Override public void setDataSource(DataSource dataSource) {
 // override to do not set datasource even if a datasource exist. 
// initialize will use a Map based JobRepository (instead of database) 
} 
} 
 类似资料:
  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 我是Spring批处理的新手,我只想问如何从多行结果集中检索数据。我有以下场景: > 有两个不同的表说员工 使用时,我只能创建一个工资单子级,但该表可能有多个子级。请帮助...

  • 我在中看到了几个答案(例如这里),因此建议批次中的记录将成为单个RDD。我对此表示怀疑,因为假设batchInterval为1分钟,那么单个RDD将包含最后一分钟的所有数据? 注意:我不是直接将批次与RDD进行比较,而是将Spark内部处理的批次进行比较。

  • 批处理 本书展示的几个例子中,ElasticSearch提供了高效的批量索引数据的功能,用户只需按批量索引的格式组织数据即可。同时,ElasticSearch也为获取数据和搜索数据提供了批处理功能。值得一提的是,该功能使用方式与批量索引类似,只需把多个请求组合到一起,每个请求可以独立指定索引及索引类型。接下来了解这些功能。 MultiGetMultiGet操作允许用户通过_mget端点在单个请求命

  • 我正在制作一个应用程序,其中每周一次必须根据系统的所有用户执行多个操作(计算)。最初估计大约有300个用户。 我的问题是,有没有一种方法可以执行这种类型的操作?比如批量处理?现在,我只使用一个用户测试脚本,在本地主机上,我使用foreach循环来循环用户并生成​​所有查询、计算和插入结果。。 我怀疑是否有更多的用户饱和了脚本或托管或类似的东西。。我如何处理这种情况? 欢呼;)

  • ValidationExceptionHandler.java 当我运行我的代码并传递无效的电子邮件地址时,我会得到以下异常。从不执行HandleConstraintVilvation中的代码。异常中返回的http状态是500,但我想返回400。你知道我怎么才能做到吗?