此线程是Github问题的继续,位于:https://github.com/spring-projects/spring-data-r2dbc/issues/194
上下文:
嗨,
我只是基于两个反应性存储库尝试了一个非常简单的示例:
给出一个r2dbc crud仓库br
和另一个r2dbc crud仓库cr
:
br.findAll()
.flatMap(br -> {
return cr.findById(br.getPropertyOne())
.doOnNext(c -> br.setProperty2(c))
.thenReturn(br);
})
.collectList().block();
此代码示例永远不会完成(仅250个左右条目进入.collectList
运算符)。经过一些挖掘之后,在onBackpressureXXX
之后添加一些findAll
运算符似乎可以通过...嗯,删除元素或对其进行缓冲来“解决”该问题。
在这一点上,我的理解是r2dbc反应性存储库没有使用消费者反馈机制,这消除了r2dbc的大部分利益。
我错了吗?有没有更好的方法可以实现相同的目标?
谢谢!
@ mp911de的建议:
作为一般规则,避免在另一个流处于活动状态时创建流(著名语录:请勿越过流)。
如果要获取相关数据,则最好将所有结果收集为List和run子查询。这样,就消耗了初始响应流,并且连接可以自由获取其他结果。
类似下面的代码片段应该可以完成这项工作:
br.findAll().collectList()
.flatMap(it -> {
List<Mono<Reference>> refs = new ArrayList<>();
for (Person p : it) {
refs.add(cr.findById(br.getPropertyOne()).doOnNext(…));
}
return Flux.concat(refs).thenReturn(it);
});
但是这消除了在不将数据全部保留在内存中的情况下进行流传输的好处(我的最后一步不是列出,而是流写入以输出到某些文件)。
对此有什么帮助吗?