【问题标题】:Spring batch JdbcCursorItemReader cause a memory not enough issueSpring batch JdbcCursorItemReader 导致内存不足的问题
【发布时间】: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


【解决方案1】:

您可以尝试使用JdbcPagingItemReader 而不是 JdbcCursorItemReader,在配置时可以设置页面大小

【讨论】:

  • 谢谢我已经通过使用 JdbcPagingItemReader 解决了这个问题
  • 请点击对您最有帮助的答案左侧的复选标记来关闭您的问题
【解决方案2】:

通过使用 jdbcPagingItemReader 解决了这个问题。游标读取器消耗大量内存的根本原因是因为它只是将所有数据读入内存然后进行处理,这将被JVM视为一个大对象,直接分配到老年代,直到整个过程结束了,收不到了。

【讨论】:

    【解决方案3】:

    我只是很困惑为什么它会使用所有内存并将所有数据加载到内存中

    根据Postgresql's documentation,驱动程序一次收集所有查询结果。

    您可以尝试通过将 fetch size 设置为 0 来关闭光标。上述文档中解释了其他限制,请确保您的代码满足所有这些限制。仅供参考,这类似于 MySQL 可能发生的情况,其中提取大小应设置为 Integer.MIN_VALUE 以流式传输结果(请参阅 herehere)。

    希望这会有所帮助。

    【讨论】:

    • 嗨,Ben,感谢您的回复,您说得对,我使用的光标阅读器将立即获取所有结果,这将构成一个大对象并直接进入老年代。这就是我的问题的根本原因。我曾尝试配置提取大小,但事实证明这对我不起作用。我终于通过使用分页阅读器解决了这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多