我有一个使用 PostgresDB 在 Netty 上运行的反应式应用程序。有一个带有 blob 列的表。如何根据请求响应式下载文件。
下面是实体——
@Table("my_documents")
@Data
public class MyDocument {
.
.
.
@Column("file_blob_data")
private byte[] fileBlobData;
}
下面是存储库类:
@Repository
public interface MyDocumentsRepository extends ReactiveSortingRepository<MyDocument, Long> {
@Query("SELECT file_blob_data FROM my_documents WHERE doc_id= $1")
Mono<MyDocument> findByDocId(Long docId);
}
打电话时
myDocumentsRepository.findByDocId(docId)
.flatMap(doc -> doc.getFileBlobData()) // LINE 1223
在第 1223 行,字节数组被加载到内存中。然后我用 ByteBuffer 包装字节数组
Mono<ByteBuffer> myDataBuffer = myDocumentsRepository.findByDocId(docId)
.flatMap(doc -> Mono.just(ByteBuffer.wrap(doc.getFileBlobData())));
然后将myDataBuffer设置到 serverResponse 的主体中。我知道这消除了响应式流式传输数据的全部目的。但是根据有关此主题的可用信息,这是我可以使下载功能正常工作的唯一方法。
实现这一目标的推荐方法是什么?在 JPA 存储库的情况下,可以创建投影接口以仅获取 blob,投影接口是否可以使用 r2dbc ReactiveSortingRepository;只获取一列?
像这样的东西:
public interface FileBlobDataOnly {
public Flux<Blob> getFileBlobData();
}
// in repository
@Query("SELECT file_blob_data FROM my_documents WHERE doc_id= $1")
Mono<FileBlobDataOnly> findByDocId(Long docId);
Blob 是一个可以流式传输 ByteBuffer 的 r2dbc 接口: https ://r2dbc.io/spec/0.8.0.RELEASE/api/io/r2dbc/spi/Blob.html#stream