我需要从数据库查询一个大数据集。实际上,我将使用分页参数(limit和offset)来避免将大型数据集加载到堆中。为此,我正试图用 RowCallBackHadler
因为医生说 An interface used by JdbcTemplate for processing rows of a ResultSet on a per-row basis.
我也读过使用这个接口逐个处理行的建议。但每次我试图获取数据时都会出错。下面是我的代码和visualvm的屏幕截图,其中包含堆空间图形,表示所有行都已加载到内存中。我正在尝试执行的查询在db中返回大约150万行。
// here just sql query, map with parameters for query, pretty simple RowCallbackHandler
jdbcTemplate.query(queryForExecute, params, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
while (rs.next()) {
System.out.println("test");
}
}
});
通过visualvm堆:
更新:我打电话时犯了个错误 rs.next()
,但是删除这一行并没有改变将行装入内存的情况
1条答案
按热度按时间c2e8gylq1#
主要问题是理解文档。医生说
jdbctemplate用于按行处理结果集的行的接口。
实际上,我的代码以正确的方式执行操作:返回一个包含所有行的resultset(因为没有定义limit)。我不相信在任何sql查询中添加limit会奏效,于是决定通过rowcallbackhandler实现limit,这是个坏主意,因为limit对所有类型的sql查询(复杂和简单)都非常有效。