嗨,我想流式传输一个非常大的表spring-data-jdbc。为此,我设置了与READ_ONLY的连接,并在我的存储库中声明了一个方法,如下所示:
PackageRepository extends Repository<Package,String> {
Stream<Package> findAll();
}我的期望是结果集应该是FORWARD_ONLY类型的,并且在从数据库接收到所有结果之前,此方法不会无限期地阻塞。
在这里,我将与Spring Data JPA进行比较,在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
}
});发布于 2021-12-03 07:59:58
只需在查询前添加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)https://stackoverflow.com/questions/55535945
复制相似问题