Spring 将数据内容直接从数据库流式传输到HTTP
现在,我们将文件保存在postgresql数据库中,并使用实体中的Spring 将数据内容直接从数据库流式传输到HTTP,spring,postgresql,jpa,spring-data-jpa,Spring,Postgresql,Jpa,Spring Data Jpa,现在,我们将文件保存在postgresql数据库中,并使用实体中的byte[]字段映射该内容。如果可以的话,我需要调查一下 将内容数据直接从数据库流式传输到HTTP输出流,并以相反的方式执行相同的操作,因此使用jpaBlob数据类型将二进制数据从HTTP流式传输到数据库。我知道Blob有getBinaryStream和setBinaryStream方法,所以它可以工作,我们不需要将数据保存到内存中 我关心的是数据库事务,因为我们正在将实体映射到DTO,第二件事是Http请求被破坏,数据可能会在某
byte[]
字段映射该内容。如果可以的话,我需要调查一下
将内容数据直接从数据库流式传输到HTTP输出流,并以相反的方式执行相同的操作,因此使用jpaBlob
数据类型将二进制数据从HTTP流式传输到数据库。我知道Blob
有getBinaryStream
和setBinaryStream
方法,所以它可以工作,我们不需要将数据保存到内存中
我关心的是数据库事务,因为我们正在将实体映射到DTO,第二件事是Http请求被破坏,数据可能会在某个点丢失
有没有人对该解决方案有任何经验?从Blob流读取数据的解决方案: 现有BLOB数据通过将OutputStream(由servlet容器提供)传递到事务方法来流化,该事务方法从事务内部将实体BLOB数据写入流。请注意,响应的内容类型是在写入数据之前设置的 实体类: 服务方式: REST API弹簧控制器方法:
从Blob读取数据流的解决方案: 现有BLOB数据通过将OutputStream(由servlet容器提供)传递到事务方法来流化,该事务方法从事务内部将实体BLOB数据写入流。请注意,响应的内容类型是在写入数据之前设置的 实体类: 服务方式: REST API弹簧控制器方法: 卢卡斯,因为JPA正是你所要求的。旨在使创建处理内容(文档、图像、视频等)的Spring应用程序变得非常容易。它支持一系列后端存储,其中一个是关系数据库,显然它们使用blob 这个JPA模块将上传的文件从请求输入流直接传输到数据库,反之亦然,因此它从不将整个文件存储在内存中,这显然会导致非常大的文件出现问题 这将使您不必在@tequilacat的答案中编写任何代码 也许值得一看。卢卡斯,因为JPA正是按照你的要求做的。旨在使创建处理内容(文档、图像、视频等)的Spring应用程序变得非常容易。它支持一系列后端存储,其中一个是关系数据库,显然它们使用blob 这个JPA模块将上传的文件从请求输入流直接传输到数据库,反之亦然,因此它从不将整个文件存储在内存中,这显然会导致非常大的文件出现问题 这将使您不必在@tequilacat的答案中编写任何代码
可能值得一看。也许这可以帮助你。安吉洛伊认为这应该是可能的。因为Spring数据支持queryOperation()的流式处理,并且您也可以流式处理您的httpResponse(),所以这可能会对您有所帮助。安吉洛伊认为这应该是可能的。因为Spring数据支持queryOperation()的流式处理,您也可以流式处理您的httpResponse()
public class Attachment {
private java.sql.Blob data;
public java.sql.Blob getData() { return data; }
}
@Transactional(readOnly = true)
public void copyContentsTo(long attachmentId, OutputStream outputStream) throws IOException {
Attachment dbAttachment = attachmentRepository.findOne(attachmentId);
try (InputStream is = dbAttachment.getData().getBinaryStream()) {
IOUtils.copy(is, outputStream);
} catch (SQLException e) {
throw new ParameterException("Cannot extract BLOB for attachment #" + attachmentId, e);
}
}
@GetMapping(value = "/api/project-attachment/{attachment-id}/content")
@ResponseStatus(HttpStatus.OK)
public void getAttachmentContent(
@PathVariable("attachment-id") long attachmentId,
HttpServletResponse response,
OutputStream stream) throws IOException {
response.setContentType(getMime(attachmentId));
attachmentService.copyContentsTo(attachmentId, stream);
}