0

我有一个使用 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

4

0 回答 0