DevBoi

[Spring Batch] Cursor ,Paging 기반 본문

Develop/[Spring Batch]

[Spring Batch] Cursor ,Paging 기반

HiSmith 2022. 4. 11. 13:27
반응형

ItemReader

배치 프로세스는 기본적으로 실시간으로 처리하기 어려울만큼, 방대한 데이터를 다룬다

ItemReader의 대응방식에서는 크게 커서,페이징 기반 이렇게 두가지가 있다.

 

Cursor 형식

-현재 Cursor가 가리키는 곳의 데이터를 읽고, Cursor는 다음 데이터를 가리킨다.

-ResultSet이 Open될때마다 next()메서드가 호출되어 DB의 데이터가 반환되고, 객체와 매핑이 이루어진다.

-DB connection은 배치 처리가 완료될 떄까지 데이터를 읽어오기 때문에 DB연결시간이 길다.

-모든 데이터를 메모리에 저장하기 때문에 메모리 사용량이 많다.

-Connection 시간과 메모리를 충분히 감당할수 있다면, 대용량 데이터 처리에 적합하다. (Fetch Size로 조절)

 

Paging 

페이징 단위로 데이터를 조회한다.

특정 페이지의 Page Size만큼 한번에 메모리로 가져온 다음 한개씩 읽는다.

페이지 단위로 DB connection을 읽고 종료한다.

DB connection 연결시간이 상대적으로 적은 편이다.

페이징 단위의 결과만 메모리에 저장하기 때문에 상대적으로 메모리 사용량이 적다.

Connection 시간이 짧아야 하고 메모리가 작은 환경의 데이터 처리에 적합하다.

 

 

 

 

 

커서방식은 DB와 커넥션을 맺은 후, Cursot를 한칸씩 옮기면서 지속적으로 데이터를 가져온다.

 

정리를 하면

 

커서 방식은, fetch size만큼 데이터를 가져와서

데이터를 Streaming하는 것이다. read() 메소드는 데이터를 하나씩 가져와서 ItemWriter로 데이터를 전달하고

다음 데이터를 가져오게 된다.

1. 처음에 패치 사이즈만큼 메모리에 올리고, Streaming 하기때문에 조심해야한다.

2. Database와 Socket Timeout 을 충분히 큰값으로 해야한다.

- 이유는, Cursor는 하나의 Connection으로 Batch가 끝날때까지 사용되기 때문에, Batch가 끝나기 전까지 DB와 어플리케이션의 커넥션이 먼저 끊어지지 않게 해야한다.

 

페이징은

커넥션당 필요한 개수를 페이징 처리된 쿼리가 나가서, 데이터를 가져온다.

즉 쿼리에 페이징 처리가 되어, 결과의 일부를 가져오는 것이다.

각 페이지 마다 개별적으로 실행되기 때문에, 결과를 정렬하는 것이 중요하다.

데이터 결과의 순서가 보장 될 수 있도록 order by 가 권장된다.

 

반응형