Spring Data Jpa 배치처리시 주의점

박상준·2024년 10월 4일
0
post-custom-banner

개요(문제상황)

  • 배치 처리시의 1차 캐싱 관련 문제가 있다.
  • 하나의 트랜잭션 라이프사이클안에서
    • 만약 여러 객체가 로드되는 경우
    • 1차 캐싱의 대상에 모두 들어가게 된다.
    • 불필요한 메모리 점유가 발생할 수 있음.

해결방안

  1. 배치 프로세싱 최적화 필요

    @Service
    @Transactional
    public class MemberBatchService {
        
        private final EntityManager entityManager;
        private final MemberRepository memberRepository;
        
        @Autowired
        public MemberBatchService(EntityManager entityManager, MemberRepository memberRepository) {
            this.entityManager = entityManager;
            this.memberRepository = memberRepository;
        }
        
        public void processMembersInBatches(int batchSize) {
            int pageNumber = 0;
            Page<Member> page;
            
            do {
                page = memberRepository.findAll(PageRequest.of(pageNumber, batchSize));
                
                for (Member member : page.getContent()) {
                    // 처리 로직
                    member.setProcessed(true);
                    memberRepository.save(member);
                }
                
                entityManager.flush();
                entityManager.clear();
                
                pageNumber++;
            } while (page.hasNext());
        }
    }
    • 에서 페이징으로 데이터를 조회하고
    • 해당 대상 데이터의 페이징마다 영속성 관리자에게 1차 캐싱을 비우도록 명령해야한다.
    • 비우지 않는 다면 모든 회원정보가 메모리에 떠있을것이다.
    • 사실 배치 프로세싱의 경우 JDBC 로 컨트롤 하는 경우가 더 많을거같긴하다
      • 스프링배치나
profile
이전 블로그 : https://oth3410.tistory.com/
post-custom-banner

0개의 댓글