약 80만건의 sql 조회 시 java.lang.OutOfMemoryError: Java heap space가 발생하였다.
조회 결과를 자바 리스트 객체에 담아서 데이터 처리를 하는것이 문제라고 판단하여, 메모리 소모를 줄이면서 대용량 데이터 조회 방법을 찾던 중 Cursor 를 이용하는 방법을 찾았다.
반환된 ResultSet의 특정 행에 대한 참조를 조작할 수 있다.
Cursor<T>는 Iterable<T>를 확장하기 때문에 for문에서 foreach처럼 작성할 수 있다.
Closable 인터페이스도 확장하기 때문에 try문에 쓰거나 close()로 닫아야 한다.
그리고 반드시 트랜잭션 내에 있어야 한다.
Cursor를 사용하면 모든 데이터가 메모리에 적재된 상태가 아니라도 데이터를 소비할 수 있다. Cursor 로 반환된 데이터는 iteration을 반복할 수 있는 상태가 되면 Cursor를 반환하여 이를 소비할 수 있게된다.