【问题标题】:Stream very large table via spring-data-jdbc Resultset.TYPE_FORWARD_ONLY READ_ONLY通过 spring-data-jdbc Resultset.TYPE_FORWARD_ONLY READ_ONLY 流式传输非常大的表
【发布时间】:2019-08-27 09:22:07
【问题描述】:

您好,我想流式传输一个非常大的表 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
            }
        });

【问题讨论】:

  • 从源代码来看,似乎还不支持游标。我注意到对于 MyBatisDataAccessStrategy 中的 findAll 方法,它已经使用了 sqlSession().selectList() 不应该在这里使用游标吗? SqlSession.selectCursor​ ?
  • 我想我明白了,基本上我需要定义我自己的DefaultDataAccessStrategy。如果我做对了。
  • 你说得对,这还不支持,但我喜欢这个主意。我看到你已经创建了一张票:jira.spring.io/browse/DATAJDBC-356 谢谢。
  • 我开始着手解决这个问题,并在 Jira 问题上添加了一些 cmets。

标签: java jdbc spring-data persistence spring-data-jdbc


【解决方案1】:

只需在查询之前添加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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2021-03-07
    • 2017-07-22
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多