java - Spring Batch:使用自定义批量大小将列表写入数据库表
问题描述
背景
我有一个 Spring Batch工作,其中:
FlatFileItemReader
- 从文件中一次读取一行ItemProcesor
- 将文件中的行转换为 aList<MyObject>
并返回List
. 也就是说,文件中的每一行都被分解为一个List<MyObject>
(文件中的 1 行转换为许多输出行)。ItemWriter
- 将 写入List<MyObject>
数据库表。(我使用这个 实现来解压从处理器和委托接收到的列表到 aJdbcBatchItemWriter
)
问题
- 在第 2 点)处理器可以返回
List
100000 个MyObject
实例。 - 在第 3 点),委托
JdbcBatchItemWriter
最终会将List
包含 100000 个对象的整个数据写入数据库。
我的问题是:JdbcBatchItemWriter
不允许自定义批量大小。出于所有实际目的,该步骤的批大小 = 提交间隔。考虑到这一点,Spring Batch中是否有另一种ItemWriter
可用的实现,它允许写入数据库并允许可配置的批量大小?如果没有,如何自己编写自定义作家来实现这一目标?
解决方案
我看不到在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
。
推荐阅读
- javascript - 将数据从 PHP 传输到 Vue
- android - 将项目上传到新版本后Unity android构建错误
- c# - 如何将对象传递给 WPF 中的按钮单击事件处理程序?C#
- mysql - Mysql中TOP N的总和
- java - Java 使用持久存储实现锁定机制
- excel - IPicture 属性显示错误 Excel vba
- python-3.x - 从 python 3.7 调用撒克逊人
- java - 覆盖 @QueryParam 注释以修剪空格
- azure - 使用 UseConnectedAccount 上下文跨两个存储帐户启动 AzStorageBlobCopy
- ios - 如何通过按 UIButton 从数组中切换 UIViewController 中的 UIImages