Open hyoseok0 opened 1 year ago
auto increment
constraint 가 걸려있을 때, id range 로 페이징 처리create_datetime
과 같은 timestamp column 에 index 를 설정하고, timestamp range 로 페이징 처리LIMIT [offset,] row_count
을 활용한 페이징은 DB 에 부하가 커서 추천하지 않는다고 합니다. 예를 들어 LIMIT 1000, 2000
은 총 3000 row 를 조회해서 1000부터 3000까지의 row 를 client로 return 하므로, offset 이 커질 수록 DB 부하가 linear 하게 증가한다고 합니다. auto increment
constraint 가 없을 때 구현이 더 복잡하거나, 기타 성능이 저하된다.
create_datetime
에 몇개의 row 가 조회되는지 예측할 수 없어, 범위를 크게 잡을 경우 OOM 의 위험이 있다. create_datetime
과 같은 timestamp column 에 index 설정 시, index 추가에 따른 DML 성능이 저하된다. useCursorFetch=true
설정JdbcCursorItemReader
사용. 이때 한번에 배치 서버로 가져올 row 수 fetchSize
property 설정 후 사용next
method 호출 시, cursor 를 다음 row 로 이동ResultSet
을 활용하며, DataSource
에서 얻어진 connection 에 대해 SQL 문을 수행JdbcCursorItemReader
내 fetchSize
에 지정된 row 만큼 배치 서버로 전송JdbcCursorItemReader
내 ResultSet 은 cursor 정보를 관리JdbcCursorItemReader
은 다음 cursor 를 시작으로 `fetchSize 에 지정된 row 만큼 MySQL 서버에 요청JdbcCursorItemReader
에서 수행하므로, step 을 ItemReader
, ItemProcessor
, ItemWriter
로 구분하기 쉽다. JdbcCursorItemReader
를 활용한 복수개의 step 으로 처리할 수 있습니다.
배경
배치 서버에서 수행중인 배치들에서 조회한 데이터 사이즈가 배치 서버의 max heap memory 크기를 넘을 때, OOM(Out Of Memory) exception 발생
예를 들어, 배치 서버에서 한개 배치가 수행된다고 가정하고, 해당 배치 서버 max heap memory 가 4GB, 배치 서버에서 조회하는 테이블 용량이 5GB이며, 배치에서
select * from 'table명'
으로 조회 시, OOM 이 발생합니다.서버의 max heap memory 는
java -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize|version'
로 확인 가능합니다.참고) 테이블 용량은 아래 쿼리로 확인 가능
해결 방안