작성
·
540
0
안녕하세요.
JdbcCursorItemReader 관련하여 질문하고 싶습니다.
Cursor 기반 처리에서 모든 결과를 메모리에 할당하여 메모리 사용량이 많아진다는 단점이 있다고 하셨는데 여기서 '모든 결과' 를 메모리에 할당하는 부분이 fetchSize 크기 만큼 메모리에 올린다는 것을 말씀하시는 건지 궁굼합니다.
혹은 커서기반으로 처리했을 때 어떤 부분에서 메모리 사용량이 많아지는지 궁굼합니다.
답변 3
1
네
Cursor 방식으로 데이터를 읽어서 처리하는 경우 읽을 데이터가 존재하지 않을 때까지 DB 커넥션을 유지한채로 계속 데이터를 FetchSize 만큼 가지고 와서 한 건씩 read 하게 됩니다.
그렇기 때문에 스트리밍 방식으로 계속 데이터를 메모리에 가지고 와서 처리하기 때문에 한번의 쿼리 결과로 조회된 데이터를 모두 처리할 때까지 커넥션이 유지되고 메모리에 적재되고 건건히 처리되는 방식입니다.
물론 GC 가 적절한 시점에 메모리 정리를 하겠지만 커넥션이 이루어지고 닫히기 까지 하나의 트랜잭션 안에서 모든 데이터가 처리되기 때문에 메모리에 계속 할당한다고 볼 수 있습니다.
참고로 Cursor 방식은 내부적으로 스냅샷 방식으로 동작하기 때문에 메모리 사용량이 많아지기도 합니다.
대신 페이징 방식은 커넥션이 이루어지고 쿼리를 실행한 후 페이징 크기 만큼 데이터를 처리하고 커넥션이 닫힙니다. 그리고 다시 커넥션이 이루어지고 쿼리를 새로 실행하는 방식으로 이루지기 때문에 페이징 크기만큼 생성된 트랜잭션 안에서 메모리 처리가 이루어진다고 볼 수 있습니다.
다만 개발 환경 및 운영 상황에 따라 위의 기준도 유동적으로 바뀔 수 있기 때문에 여러 테스트를 통해서 적절한 방식을 결정해야 합니다.
0
0