Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 将数据内容直接从数据库流式传输到HTTP_Spring_Postgresql_Jpa_Spring Data Jpa - Fatal编程技术网

Spring 将数据内容直接从数据库流式传输到HTTP

Spring 将数据内容直接从数据库流式传输到HTTP,spring,postgresql,jpa,spring-data-jpa,Spring,Postgresql,Jpa,Spring Data Jpa,现在,我们将文件保存在postgresql数据库中,并使用实体中的byte[]字段映射该内容。如果可以的话,我需要调查一下 将内容数据直接从数据库流式传输到HTTP输出流,并以相反的方式执行相同的操作,因此使用jpaBlob数据类型将二进制数据从HTTP流式传输到数据库。我知道Blob有getBinaryStream和setBinaryStream方法,所以它可以工作,我们不需要将数据保存到内存中 我关心的是数据库事务,因为我们正在将实体映射到DTO,第二件事是Http请求被破坏,数据可能会在某

现在,我们将文件保存在postgresql数据库中,并使用实体中的
byte[]
字段映射该内容。如果可以的话,我需要调查一下 将内容数据直接从数据库流式传输到HTTP输出流,并以相反的方式执行相同的操作,因此使用jpa
Blob
数据类型将二进制数据从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);
}