rowcallbackhandler加载行信息内存

erhoui1w  于 2021-07-16  发布在  Java
关注(0)|答案(1)|浏览(320)

我需要从数据库查询一个大数据集。实际上,我将使用分页参数(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() ,但是删除这一行并没有改变将行装入内存的情况

c2e8gylq

c2e8gylq1#

主要问题是理解文档。医生说
jdbctemplate用于按行处理结果集的行的接口。
实际上,我的代码以正确的方式执行操作:返回一个包含所有行的resultset(因为没有定义limit)。我不相信在任何sql查询中添加limit会奏效,于是决定通过rowcallbackhandler实现limit,这是个坏主意,因为limit对所有类型的sql查询(复杂和简单)都非常有效。

相关问题