1

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

PackageRepository extends Repository<Package,String> {

Stream<Package> findAll();

}

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

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

我错过了一些配置吗?如何使用 spring-data-jdbc 实现这种行为?

更新:我将以不同的形式提出问题。如何使用 spring-data-jdbs 实现相当于:

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

1 回答 1

0

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

namedTemplate.getJdbcTemplate().setFetchSize(Integer.MIN_VALUE);
Stream<LargeEntity> entities = namedTemplate.queryForStream(sql, params, rowMapper);

依赖项:

spring framework 5.3+
mysql-connector-java 8.0.x (or mariadb-java-client 2.7.x)
于 2021-12-03T07:59:58.160 回答