我正在尝试使用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
为什么我没有得到结果集或者无法执行查询。我是个新手,有点卡住了。调试显示,数据源配置正确。
谢谢!
这个问题已经解决了,我使用了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。你知道我怎么才能做到吗?