我遇到了一个问题,我试图在一个有 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
您不需要将完整的数据集加载到内存中,而是应该即时处理它:
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));
});