【问题标题】:PB using JdbcBatchItemWriter with CompositeItemWriter in JAVA code- Spring-BatchPB 在 JAVA 代码中使用 JdbcBatchItemWriter 和 CompositeItemWriter - Spring-Batch
【发布时间】:2015-09-21 13:12:33
【问题描述】:

我已经扩展了 Spring-Batch 官方网站 - Batch Processing Service 提供的批处理服务代码,并修改了 ItemWriter 以生成 CSV 并写入数据库。

我使用 CompositeItemWriter 写入 CSV 和数据库。 但是 JdbcBatchItemWriter 无法与 CompositeItemWriter 一起正常工作。代码如下所示。

    @Bean
public ItemWriter<Person> writer(DataSource dataSource) {
CompositeItemWriter<Person> cWriter = new CompositeItemWriter<Person>();   

// For DataBase 
JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
    writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
    writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
    writer.setDataSource(dataSource);

// For CSV
FlatFileItemWriter<Person> csvWriter = new FlatFileItemWriter<Person>();
csvWriter.setResource(new FileSystemResource(new File("./csv/new-data.csv")));
csvWriter.setShouldDeleteIfExists(true);
DelimitedLineAggregator<Person> lineAggregator = new DelimitedLineAggregator<Person>();
lineAggregator.setDelimiter(","); 

BeanWrapperFieldExtractor<Person> fieldExtractor = new BeanWrapperFieldExtractor<Person>();
String[] names = {"firstName", "lastName"};
fieldExtractor.setNames(names);
lineAggregator.setFieldExtractor(fieldExtractor);
csvWriter.setLineAggregator(lineAggregator);

List<ItemWriter<? super Person>> mWriter = new ArrayList<ItemWriter<? super Person>>();
mWriter.add(writer); // **Comment this line and the code works fine**
mWriter.add(csvWriter);
cWriter.setDelegates(mWriter);
    return cWriter;
}

评论这一行 - mWriter.add(writer);运行代码。这表明 CompositeItemWriter 可以很好地与 FlatFileitemWriter 一起工作,但不能与 JdbcBatchItemWriter 一起工作。我得到的错误是 -

or.springframework.jdbc.BadSqlGrammerException: PreparedStatementCallback; bad SQL grammar 
[insert into people(first_name, last_name) VALUES (:firstName, :lastName)]

Caused by: Syntax error in SQl statement "insert into people((first_name, last_name) VALUES (:[*]firstName, :lastName)"; expected"), DEFAULT, NOT, EXISTS, INTERSECTS, SELECT, FROM"; SQL Statement:

如何解析 JdbcBatchItemWriter 以与 CompositeItemWriter 一起正常工作?

【问题讨论】:

  • 你能检查你的SQL吗,我在这里看到双括号...插入人((first_name
  • 我认为您正在检查错误(这是一个错字)。请查看正确的代码。
  • 除了一个 double ) 为什么是“插入 person”而不是“插入 people”?
  • 这是一个错字已更正。但问题不在于查询,如果我从上面的代码返回 writer 数据库插入工作正常,这意味着上面的查询是正确的。

标签: java spring spring-batch


【解决方案1】:

这是 jdbc 自动配置的问题,在多个 itemWriter 的情况下没有运行。请以相同的顺序添加最后一行:-

JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Person>());
writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)");
writer.setDataSource(dataSource);

writer.afterPropertiesSet();

【讨论】:

  • 不工作。得到同样的例外。但是,如果我评论 mWriter.add(writer);并返回 CompositeItemWriter 它工作正常。问题是当我在 CompositeItemWriter 中添加 JDBCBatchItemWriter 时。
  • 我刚刚从您提供的链接中导入了 Spring 项目并将 ItemWriter 更改为您使用的内容,并收到与您所说的不同的以下错误。请验证:- 在 org.springframework.batch.item.database.JdbcBatchItemWriter$1.doInPreparedStatement(JdbcBatchItemWriter.java:185) 的 org.springframework.batch.item.database.JdbcBatchItemWriter$1.doInPreparedStatement(JdbcBatchItemWriter.java:189) .springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644)
  • 感谢您检查 Avis。我不确定发生了什么,因为我现在也遇到了同样的异常! java.lang.NullPointerException:在 org.springframework.batch.item.database.JdbcBatchItemWriter$1.doInPreparedStatement(JdbcBatchItemWriter.java:189) 的 org.springframework.batch.item.database.JdbcBatchItemWriter$1.doInPreparedStatement(JdbcBatchItemWriter.java:189) 处为空)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多