首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过spring-data-jdbc Resultset.TYPE_FORWARD_ONLY READ_ONLY流式传输非常大的表

通过spring-data-jdbc Resultset.TYPE_FORWARD_ONLY READ_ONLY流式传输非常大的表
EN

Stack Overflow用户
提问于 2019-04-05 20:57:12
回答 1查看 1.3K关注 0票数 1

嗨,我想流式传输一个非常大的表spring-data-jdbc。为此,我设置了与READ_ONLY的连接,并在我的存储库中声明了一个方法,如下所示:

代码语言:javascript
复制
PackageRepository extends Repository<Package,String> {

Stream<Package> findAll();

}

我的期望是结果集应该是FORWARD_ONLY类型的,并且在从数据库接收到所有结果之前,此方法不会无限期地阻塞。

在这里,我将与Spring Data JPA进行比较,在Spring Data JPA中,Stream方法不是阻塞的,数据库的内容是根据获取的大小分部分获取的。

我是不是错过了一些配置?如何使用spring-data-jdbc实现此行为?

更新:我将以不同的形式提出这个问题。如何使用spring-data-jdbs实现以下功能的等价物:

代码语言:javascript
复制
template.query(new PreparedStatementCreator() {

            @Override
            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                PreparedStatement statement =  con.prepareStatement("select * from MYTABLE with UR",ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
                statement.setFetchSize(150000);
                return statement;
            }
        }, new RowCallbackHandler() {

            @Override
            public void processRow(ResultSet rs) throws SQLException {

                // do my processing here
            }
        });
EN

回答 1

Stack Overflow用户

发布于 2021-12-03 07:59:58

只需在查询前添加setFetchSize(Integer.MIN_VALUE)queryForStream确实为我们提供了一个流,它将一个接一个地加载记录,而不是急切地将所有记录一次性加载到内存中。

代码语言:javascript
复制
namedTemplate.getJdbcTemplate().setFetchSize(Integer.MIN_VALUE);
Stream<LargeEntity> entities = namedTemplate.queryForStream(sql, params, rowMapper);

依赖关系:

代码语言:javascript
复制
spring framework 5.3+
mysql-connector-java 8.0.x (or mariadb-java-client 2.7.x)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55535945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档