是否可以使用 springboot 获取大量数据,或者我们应该尝试其他方法吗? [关闭]

问题描述 投票:0回答:1

我遇到了一个问题,我试图在一个有 2.32 亿条记录的表上使用选择查询时内存不足。特定字段是一个包含 17 个字符的字符串。我的主要任务是与特定表建立连接,获取选定的数据,然后使用该数据调用 API。然后将其摄取到另一张桌子。当然,我的内存不足。有没有人有什么建议。由于我无法共享代码库,因此我保持通用,但我想知道这种设计是否适用于如此大的数据集。

下面是我的跑步者。

 @Override
    public void run(ApplicationArguments args) {
        final long startTimeAt = System.currentTimeMillis();

        // List with all the data from AT database
        List<Data> data = DataRepository.getData(); //ERROR
        final long endTimeAt = System.currentTimeMillis();

        log.info("AT data retrieval took time: {}", endTimeAt - startTimeAt);

这就是我获取数据的方式

@Override
    public List<Data> getData() {
        jdbcTemplate.setFetchSize(10000);
        return jdbcTemplate.query(getVinDataQuery, new BeanPropertyRowMapper<>(Data.class));
    }

如果这对我有帮助是我得到的错误:

java.lang.OutOfMemoryError: Java heap space

java spring-boot heap-memory jdbctemplate
1个回答
0
投票

您不需要将完整的数据集加载到内存中,而是应该即时处理它:

class JdbcTemplate {
    public void query(String sql, RowCallbackHandler rch) throws DataAccessException;
}

例如:

jdbcTemplate.query(getVinDataQuery, rs -> {
    // process each row...
    final String id = rs.getString("id");
    final String text = rs.getString("text");

    doProcessRow(new Data(id, text));
});

© www.soinside.com 2019 - 2024. All rights reserved.