【发布时间】:2022-01-04 12:31:15
【问题描述】:
我在 Quarkus 中实现了一个 GET 方法,它应该向客户端发送大量数据。使用 JPA/Hibernate 从数据库中读取数据,序列化为 JSON,然后发送到客户端。如果不将整个数据都保存在内存中,如何有效地做到这一点?我尝试了以下三种可能性都没有成功:
- 使用来自 JPA 的
getResultList并返回一个Response并将列表作为正文。MessageBodyWriter将负责将列表序列化为 JSON。但是,这会将所有数据拉入内存,这对于大量记录是不可行的。 - 使用来自 JPA 的
getResultStream并返回一个Response以流作为主体。MessageBodyWriter将负责将流序列化为 JSON。不幸的是,这不起作用,因为在执行 JAX-RS 方法之后和调用MessageBodyWriter之前,EntityManager似乎已关闭。这意味着底层的ResultSet也已关闭,写入器无法再从流中读取。 - 使用
StreamingOutput作为Response正文。出现与 2. 中相同的问题。
所以我的问题是:使用 Quarkus 发送通过 JPA 读取的大数据的技巧是什么?
【问题讨论】:
-
读取大量数据块的标准方法是分页,您的用例看起来如何,所以这不可行?
-
我想避免分页,因为如果流式传输结果有效,则不需要分页。
标签: java hibernate jpa jax-rs quarkus