首页 > 解决方案 > Spring Batch:使用自定义批量大小将列表写入数据库表

问题描述

背景

我有一个 Spring Batch工作,其中:

  1. FlatFileItemReader- 从文件中一次读取一行
  2. ItemProcesor- 将文件中的行转换为 aList<MyObject>并返回List. 也就是说,文件中的每一行都被分解为一个List<MyObject>(文件中的 1 行转换为许多输出行)。
  3. ItemWriter- 将 写入List<MyObject>数据库表。(我使用这个 实现来解压从处理器和委托接收到的列表到 a JdbcBatchItemWriter

问题

我的问题是:JdbcBatchItemWriter不允许自定义批量大小。出于所有实际目的,该步骤的批大小 = 提交间隔。考虑到这一点,Spring Batch中是否有另一种ItemWriter可用的实现,它允许写入数据库并允许可配置的批量大小?如果没有,如何自己编写自定义作家来实现这一目标?

标签: javaspring-batchspring-jdbcjdbctemplateitemwriter

解决方案


我看不到在JdbcBatchItemWriter. 但是,您可以扩展编写器并使用自定义BatchPreparedStatementSetter来指定批量大小。这是一个简单的例子:

public class MyCustomWriter<T> extends JdbcBatchItemWriter<T> {

    @Override
    public void write(List<? extends T> items) throws Exception {
        namedParameterJdbcTemplate.getJdbcOperations().batchUpdate("your sql", new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                // set values on your sql
            }

            @Override
            public int getBatchSize() {
                return items.size(); // or any other value you want
            }
        });
    }

}

示例中的StagingItemWriter也是如何使用自定义的示例BatchPreparedStatementSetter


推荐阅读