java 有没有可能用springboot获得大量数据,或者我们应该尝试其他方法?[关闭]

a9wyjsp7  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(99)

已关闭,该问题需要details or clarity,目前不接受回答。
**想要改进此问题?**通过editing this post添加详细信息并澄清问题。

昨天关门了。
Improve this question
我遇到了一个问题,我试图在一个有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

af7jpaap

af7jpaap1#

您不需要将整个数据集加载到内存中,而是应该动态处理它:

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));
});

相关问题