ResultSet 이라도 쓸 땐 써야죠...
ORM(JPA)나 MyBatis 같은 객체에 데이터를 자동 저장해주는 라이브러리, 프래임워크 등을 쓰다보니, ResultSet 이 뭔지도 모르고 써본 적도 없는 개발자들이 늘고 있는 것 같습니다.
객체지향언어에서는 특히 객체에 값을 담고 쓰는게 진리처럼 얘기되지만요…
데이터를 페이징 하지 않고 한 번에 많은 양을 조회하고, 그걸 이용해서 프로그램 내에서 반복문 돌면서 연산한다거나 해서 장시간 사용중이라면, 당연히 GC 하질 못해서 Old 영역에서 더 이상 비우질 못해서 문제가 생기지 않겠습니까?
그래서, 대용량의 데이터를 취급할 때에는 ResultSet 을 쓰면서 DB 종류에 따라 fetchSize 를 지정하여 한 번에 미리 저장해두는 양에 대해서 조절이 필요합니다. 아니라면 MyBatisPagingItemReader 나 ResultHandler 같은 걸 활용해서 List 에 무지성으로 담지 말고 필요한 것들만 하나씩 가져오게(성능은 떨어지겠지만) 구성을 바꾸는 지혜가 필요하다고 생각합니다.
그냥 List, 그것도 List<Map> 이런 식으로 쓰고, 심지어 Parallel GC 인 상태로 운영하다가 old 영역에 더 이상 비울 것이 없으면 무지성으로 계속 Full GC 시도하면서 CPU 100% 가 되는 마법을 보실 수 있습니다.
네…
어제 장애 났습니다. -_-;