인프런 커뮤니티 질문&답변

bk8540님의 프로필 이미지
bk8540

작성한 질문수

스프링 배치

Cursor 방식 ItemReader 관련 질문입니다.

작성

·

537

0

안녕하세요.

JdbcCursorItemReader 관련하여 질문하고 싶습니다.

Cursor 기반 처리에서 모든 결과를 메모리에 할당하여 메모리 사용량이 많아진다는 단점이 있다고 하셨는데 여기서 '모든 결과' 를 메모리에 할당하는 부분이  fetchSize 크기 만큼 메모리에 올린다는 것을 말씀하시는 건지 궁굼합니다.

혹은 커서기반으로 처리했을 때 어떤 부분에서 메모리 사용량이 많아지는지 궁굼합니다.

 

답변 3

1

정수원님의 프로필 이미지
정수원
지식공유자

Cursor 방식으로 데이터를 읽어서 처리하는 경우 읽을 데이터가 존재하지 않을 때까지 DB 커넥션을 유지한채로 계속 데이터를 FetchSize 만큼 가지고 와서 한 건씩 read 하게 됩니다.

그렇기 때문에 스트리밍 방식으로 계속 데이터를 메모리에 가지고 와서 처리하기 때문에 한번의 쿼리 결과로 조회된 데이터를 모두 처리할 때까지 커넥션이 유지되고 메모리에 적재되고 건건히 처리되는 방식입니다.

물론  GC 가 적절한 시점에 메모리 정리를 하겠지만 커넥션이 이루어지고 닫히기 까지 하나의 트랜잭션 안에서 모든 데이터가 처리되기 때문에 메모리에 계속 할당한다고 볼 수 있습니다.

참고로 Cursor 방식은 내부적으로 스냅샷 방식으로 동작하기 때문에 메모리 사용량이 많아지기도 합니다. 

대신 페이징 방식은 커넥션이 이루어지고 쿼리를 실행한 후 페이징 크기 만큼 데이터를 처리하고 커넥션이 닫힙니다. 그리고 다시 커넥션이 이루어지고 쿼리를 새로 실행하는 방식으로 이루지기 때문에 페이징 크기만큼 생성된 트랜잭션 안에서 메모리 처리가 이루어진다고 볼 수 있습니다.

다만 개발 환경 및 운영 상황에 따라 위의 기준도 유동적으로 바뀔 수 있기 때문에 여러 테스트를 통해서 적절한 방식을 결정해야 합니다.

0

정수원님의 프로필 이미지
정수원
지식공유자

모든 결과를 메모리에 계속 누적한다는 의미보다는 스트리밍 방식으로 하나의 커넥선 안에서 데이터를 계속 읽고 처리한다는 개념으로 이해하시면 될 것 같습니다

0

bk8540님의 프로필 이미지
bk8540
질문자

감사합니다!

즉 커넥션이 유지되는 동안의 모든 데이터가 메모리에 쌓인다고 이해하면 되나요??

 

bk8540님의 프로필 이미지
bk8540

작성한 질문수

질문하기