【发布时间】:2019-03-28 05:56:31
【问题描述】:
我正在使用 Spring Batch 框架进行数据迁移。我使用的阅读器是 JdbcCursorItemReader。我将块大小设置为 500 并将读取器获取大小设置为 1000。但是当使用 spring batch 运行服务时,它似乎只是在内存中读取所有数据并用完内存。然后抛出内存不足的问题。以下是我对读者的定义:
private JdbcCursorItemReader<Map<String, Object>> buildItemReader(final DataSource dataSource, String tableName,String tenant) {
String tenantName = tenantHelper.determineTenant(tableName);
JdbcCursorItemReader<Map<String, Object>> itemReader = new JdbcCursorItemReader<>();
itemReader.setDataSource(dataSource);
itemReader.setSql("select * from " + tableName + " where " + tenantName + " ='" + tenant + "'");
itemReader.setRowMapper(new ColumnMapRowMapper());
itemReader.setFetchSize(100);
return itemReader;
}
更重要的是,从spring批处理文档here中,我们应该可以通过使用jdbcCursorItemReader来避免内存问题
【问题讨论】:
-
显然查询只会获取完整结果,因为您没有大小限制。我想你需要
Partitioner -
嗨@soorapadman,分区器是否意味着将过程拆分为更多步骤?由于某些原因,我无法使用该功能,因为我必须动态创建步骤。我也在考虑使用 jdbcPagingItemReader。但是分页对我也不起作用,我也按照这个问题的描述进行了尝试:stackoverflow.com/questions/55369572/…
-
获取大小只是对数据库驱动程序的提示,其实现取决于数据库产品。您使用哪个数据库?
-
我正在使用 postgresql。我调试了 jdbcCursorItemReader,它确实通过获取大小和块大小进行了读/写。但我只是很困惑为什么它会使用所有内存并将所有数据加载到内存中
-
好的,感谢您的更新。我添加了一个答案,希望对您有所帮助。
标签: java spring-batch