Spring, Java : 메모리 부족 오류 방지를위한 스트리밍 파일 다운로드

우리는 보그입니다

사용자가 파일을 다운로드 할 수있는 Spring-MVC 애플리케이션을 개발 중입니다. 사용자는 다운로드 메커니즘을 트리거하는 첨부 파일을 클릭 할 수 있습니다.

어제 여러 다운로드 중 2 개에 약 2GB의 파일이있을 때 메모리 부족 오류 (아래 로그)가 발생했습니다.

이 문제를 피하기 위해이 문제를 해결하는 한 가지 방법은 다운로드 데이터를 청크로 스트리밍하고 전체 파일이 아닌 서비스 계층에서 해당 청크 만 처리하는 것처럼 보였습니다.

불행히도 나는 이것으로 진행하는 방법을 모릅니다. 어떤 도움이라도 좋을 것입니다. 이 옵션이 비행 할 수없는 경우이 문제를 해결하는 방법에 대한 권장 사항입니다.

오류 기록 :

HTTP Status 500 - Handler processing failed; nested exception is java.lang.OutOfMemoryError: Direct buffer memory

type Exception report

message Handler processing failed; nested exception is java.lang.OutOfMemoryError: Direct buffer memory

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.OutOfMemoryError: Direct buffer memory
    org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1303)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:977)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)

컨트롤러 코드 :

    @RequestMapping(value = "/download/attachment/{attachid}", method = RequestMethod.GET)
        public void getAttachmentFromDatabase(@PathVariable("attachid") int attachid,
    , HttpServletResponse response,) {

response.setContentType("application/octet-stream");
GroupAttachments groupAttachments = this.groupAttachmentsService.getAttachmenById(attachid);
response.setHeader("Content-Disposition", "attachment; filename=\"" + groupAttachments.getFileName() + "\"");
                            response.setContentLength(groupAttachments.getSendAttachment().length);
                            FileCopyUtils.copy(groupAttachments.getSendAttachment(), response.getOutputStream());
    response.flushBuffer();

    }

서비스 계층 :

@Override
    public GroupAttachments getAttachmenById(int attachId) {
        Person person = this.personService.getCurrentlyAuthenticatedUser();
        GroupAttachments groupAttachments = this.groupAttachmentsDAO.getAttachmenById(attachId);

        GroupMembers groupMembers = this.groupMembersService.returnMembersMatchingUsernameAccountId(person.getUsername(),
                groupAttachments.getGroupId());
        if (!(groupMembers == null)) {
            if (person.getUsername().equals(groupMembers.getMemberUsername())) {
                try {
                    Path path = Paths.get(msg + groupAttachments.getGroupId() + "/" +
                            groupAttachments.getFileIdentifier());
                    groupAttachments.setSendAttachment(Files.readAllBytes(path));
                    return groupAttachments;
                } catch (IOException ignored) {
                    this.groupAttachmentsDAO.removeAttachment(attachId);
                    return null;
                }
            }
            return null;
        } else {
            return null;
        }
    }

감사합니다. :-)

최신 정보

새로운 다운로드 메커니즘 :

컨트롤러 :

 public ResponseEntity<byte[]> getAttachmentFromDatabase(@PathVariable("attachid") int attachid,
                                                    @PathVariable("groupaccountid") Long groupAccountId, @PathVariable("api") String api,
                                                    HttpServletResponse response,
                                                    @PathVariable("type") boolean type) {

 Path path = this.groupAttachmentsService.getAttachmentPathById(attachid);

        GroupAttachments groupAttachments = this.groupAttachmentsService.getAttachmentObjectOnlyById(attachid);
                        response.setContentType("application/octet-stream");
                        response.setHeader("Content-Disposition", "attachment; filename=\""+groupAttachments.getFileName()+"\"");
  try {
OutputStream outputStream = response.getOutputStream();

Files.copy(path,outputStream);
outputStream.flush();
outputStream.close();
response.flushBuffer();
}

서비스 계층 :

@Override
    public Path getAttachmentPathById(int attachId){
        Person person = this.personService.getCurrentlyAuthenticatedUser();
        GroupAttachments groupAttachments = this.groupAttachmentsDAO.getAttachmenById(attachId);

        GroupMembers groupMembers = this.groupMembersService.returnMembersMatchingUsernameAccountId(person.getUsername(),
                groupAttachments.getGroupId());
        if (!(groupMembers == null)) {
            if (person.getUsername().equals(groupMembers.getMemberUsername())) {
                try {
                    return Paths.get(msg + groupAttachments.getGroupId() + "/" +
                            groupAttachments.getFileIdentifier());
                } catch (Exception ignored) {
                    return null;
                }
            }
            return null;
        } else {
            return null;
        }
    }
마커스

먼저 전체 파일 콘텐츠를 메모리에로드하므로 서비스의 전체 콘텐츠로드를 중지합니다.

를 구성하는 방법 작성 Path를 들어 GroupAttachments, 나는에 그것을 만들 것 GroupAttachments그 자체.

public class GroupAttachments {

    public Path getPath() {
        return Paths.get(msg + getGroupId() + "/" + getFileIdentifier());
    }
}

그런 다음 컨트롤러에서 간단히

@RequestMapping(value = "/download/attachment/{attachid}", method = RequestMethod.GET)
public void getAttachmentFromDatabase(@PathVariable("attachid") int attachid, HttpServletResponse response) {

  response.setContentType("application/octet-stream");
  GroupAttachments groupAttachments = this.groupAttachmentsService.getAttachmenById(attachid);
  Path path = groupAttachmetns.getPath(); // calculates the java.nio.file.Path  
  response.setHeader("Content-Disposition", "attachment; filename=\"" + path.getFileName() + "\"");
  response.setContentLength(Files.size(path);
  Files.copy(path, response.getOutputStream());
  response.flushBuffer();

}

더 복잡하게 만들 필요가 없습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

메모리 부족 오류를 제공하는 큰 비디오 파일 다운로드

분류에서Dev

메모리가 부족한 curl로 파일 sftp 다운로드

분류에서Dev

Mongodb 빌드 / 컴파일 오류 : Ubuntu에서 메모리 부족

분류에서Dev

Android 활동의 UI를로드하는 동안 Java 메모리 부족 오류

분류에서Dev

VICE 에뮬레이터에서 PRG 파일을로드 한 후 C64 메모리 부족 오류

분류에서Dev

Python Spark : Java 메모리 부족 오류

분류에서Dev

TextWrangler에서 .txt 파일 가져 오기-메모리 부족 오류 코드 : -108

분류에서Dev

메모리 부족 오류 이미지 로더

분류에서Dev

CUDA 오류 : 메모리 부족-Python 프로세스는 모든 GPU 메모리를 사용합니다.

분류에서Dev

메모리 부족없이 XDocument를 zip 파일로 저장

분류에서Dev

메모리 부족 오류를 파악할 수있는 올바른 위치

분류에서Dev

Google Drive API V3 대용량 파일 다운로드 메모리 부족

분류에서Dev

안드로이드 범용 이미지 로더 메모리 부족 오류

분류에서Dev

메모리 부족 오류, permgen, Java 8에서 Java 7로 이동

분류에서Dev

재귀 파이썬 함수에서 "메모리 부족"오류 방지

분류에서Dev

netbeans의 프로세서를 설치하는 동안 Java 메모리 부족 오류

분류에서Dev

netbeans의 프로세서 설치 중 Java 메모리 부족 오류

분류에서Dev

Android에서 더 큰 파일을 업로드하는 동안 메모리 부족 오류가 표시됩니까?

분류에서Dev

메모리 부족 오류로 인해 Setalphabitmap이 작동하지 않습니다.

분류에서Dev

메모리 부족을 방지하기위한 Java 최적화

분류에서Dev

MATLAB의 일대일 분류 및 메모리 부족 오류

분류에서Dev

MATLAB의 일대일 분류 및 메모리 부족 오류

분류에서Dev

새로운 문제-런타임 오류-메모리 부족

분류에서Dev

다중 처리를 사용하여 공유 메모리를 할당 할 때 가짜 메모리 부족 오류

분류에서Dev

Jboss의 메모리 부족 오류가 로그 파일에 항목을 생성합니까?

분류에서Dev

Python + Selenium 첫로드시 메모리 부족 오류

분류에서Dev

AFNetworking NSOperations를 사용하여 여러 파일을 직렬로 다운로드합니다 ...... 메모리가 부족합니다.

분류에서Dev

메모리 부족 오류, Java 힙 공간

분류에서Dev

Java 메모리 부족 어레이 오류

Related 관련 기사

  1. 1

    메모리 부족 오류를 제공하는 큰 비디오 파일 다운로드

  2. 2

    메모리가 부족한 curl로 파일 sftp 다운로드

  3. 3

    Mongodb 빌드 / 컴파일 오류 : Ubuntu에서 메모리 부족

  4. 4

    Android 활동의 UI를로드하는 동안 Java 메모리 부족 오류

  5. 5

    VICE 에뮬레이터에서 PRG 파일을로드 한 후 C64 메모리 부족 오류

  6. 6

    Python Spark : Java 메모리 부족 오류

  7. 7

    TextWrangler에서 .txt 파일 가져 오기-메모리 부족 오류 코드 : -108

  8. 8

    메모리 부족 오류 이미지 로더

  9. 9

    CUDA 오류 : 메모리 부족-Python 프로세스는 모든 GPU 메모리를 사용합니다.

  10. 10

    메모리 부족없이 XDocument를 zip 파일로 저장

  11. 11

    메모리 부족 오류를 파악할 수있는 올바른 위치

  12. 12

    Google Drive API V3 대용량 파일 다운로드 메모리 부족

  13. 13

    안드로이드 범용 이미지 로더 메모리 부족 오류

  14. 14

    메모리 부족 오류, permgen, Java 8에서 Java 7로 이동

  15. 15

    재귀 파이썬 함수에서 "메모리 부족"오류 방지

  16. 16

    netbeans의 프로세서를 설치하는 동안 Java 메모리 부족 오류

  17. 17

    netbeans의 프로세서 설치 중 Java 메모리 부족 오류

  18. 18

    Android에서 더 큰 파일을 업로드하는 동안 메모리 부족 오류가 표시됩니까?

  19. 19

    메모리 부족 오류로 인해 Setalphabitmap이 작동하지 않습니다.

  20. 20

    메모리 부족을 방지하기위한 Java 최적화

  21. 21

    MATLAB의 일대일 분류 및 메모리 부족 오류

  22. 22

    MATLAB의 일대일 분류 및 메모리 부족 오류

  23. 23

    새로운 문제-런타임 오류-메모리 부족

  24. 24

    다중 처리를 사용하여 공유 메모리를 할당 할 때 가짜 메모리 부족 오류

  25. 25

    Jboss의 메모리 부족 오류가 로그 파일에 항목을 생성합니까?

  26. 26

    Python + Selenium 첫로드시 메모리 부족 오류

  27. 27

    AFNetworking NSOperations를 사용하여 여러 파일을 직렬로 다운로드합니다 ...... 메모리가 부족합니다.

  28. 28

    메모리 부족 오류, Java 힙 공간

  29. 29

    Java 메모리 부족 어레이 오류

뜨겁다태그

보관