강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

MinKyu Song님의 프로필 이미지
MinKyu Song

작성한 질문수

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

게시글 테스트 데이터 삽입

게시글 테스트 데이터 삽입 에서 SQL 최대 2만건 삽입 되는문제

해결된 질문

작성

·

131

0

게시글 데이터 삽입 부분에서요, 영상 강의에서는 데이터 1200만건 삽입 하는데 대략 13분 정도 걸리는걸 확인 햇는데, 저는 2초만에 끝나더니 삽입된 갯수 확인해보니까 2만건만 추가 되고 더 추가 안된거같은데 어떤 문제가 있을가요??

아래는 코드랑 영상에서 설명한 sql 설정값 첨부 했습니다.


@SpringBootTest
public class DataInitializer {
    @PersistenceContext
    EntityManager entityManager;
    @Autowired
    TransactionTemplate transactionTemplate;
    Snowflake snowflake = new Snowflake();
    CountDownLatch latch = new CountDownLatch(EXECUTE_COUNT);

    static final int BULK_INSERT_SIZE = 2000;
    static final int EXECUTE_COUNT = 6000;

    @Test
    void initialize() throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for(int i = 0; i < EXECUTE_COUNT; i++) {
            executorService.submit(() -> {
                insert();
                latch.countDown();
                System.out.println("latch.getCount() = " + latch.getCount());
            });
        }
        latch.await();
        executorService.shutdown();
    }

    void insert() {
        transactionTemplate.executeWithoutResult(status -> {
            for(int i = 0; i < BULK_INSERT_SIZE; i++) {
                Article article = Article.create(
                        snowflake.nextId(),
                        "title" + i,
                        "content" + i,
                        1L,
                        1L
                );
                entityManager.persist(article);
            }
        });
    }
}
image.png

 

답변 2

0

쿠케님의 프로필 이미지
쿠케
지식공유자

MinKyu Song님, 안녕하세요!

코드로 봤을 때에는 이상 없어보이는데 이상하네요..

2만건이면, 10개의 스레드풀에서 각 스레드가 1번씩만 실행되고 종료된 것 같은데, 따로 로그 남은건 없을까요?

스프링부트 버전도 강의와 일치하는지 궁금합니다!

MinKyu Song님의 프로필 이미지
MinKyu Song
질문자

다시 똑같은 코드로 테스트 돌리니까 1200만건이 삽입 됫어요, 처음에 왜그랫는지 모르겟지만, 스프링 버전은 아래내용으로 강의와 맞게 설정 햇어요

plugins { id 'java' id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.7' }

쿠케님의 프로필 이미지
쿠케
지식공유자

앗, 그렇군요. 실수로 취소가 눌러졌거나 뭔가 실행이 잘 안됐었나보네요..!?

아무튼 잘 해결되어서 다행입니다!

0

안녕하세요, 인프런 AI 인턴입니다. MinKyu Song님.

질문 주신 내용은 대량의 데이터를 삽입할 때 일부 데이터만 삽입되고 전체 데이터 삽입이 완료되지 못한 문제에 관한 것입니다. 아래에서는 이와 관련된 몇 가지 주요 원인과 해결 방법을 안내드립니다.

주요 원인 및 해결 방법

  1. 트랜잭션과 커밋 문제:

    • 제공해주신 코드에서는 transactionTemplate.executeWithoutResult 안에서 EntityManager.persist를 호출하여 데이터를 삽입하고 있습니다.
    • 대량의 데이터를 삽입할 때 트랜잭션이 너무 커지면 문제가 발생할 수 있으므로, 데이터의 양을 조절하거나 적용 가능한 경우, flush()clear() 메소드를 통해 중간에 커밋하는 방법을 고려해 볼 수 있습니다.
  2. 메모리 이슈:

    • 대량의 데이터를 한 번에 삽입하기 때문에 JVM의 메모리 제한에 걸릴 수 있습니다. 이 경우 JVM 옵션을 통해 힙 메모리를 늘리는 방법도 있습니다.
    • -Xmx-Xms 옵션을 사용하여 JVM의 메모리 크기를 설정할 수 있으며, 이 값이 충분히 큰지 확인해 보세요.
  3. 데이터베이스 설정:

    • MySQL의 설정 중 max_allowed_packet 값이 너무 작거나, 다른 쿼리 제한 설정이 있는지 확인합니다. 이 설정을 통해 데이터베이스에서 수용할 수 있는 데이터의 최대 크기를 조절할 수 있습니다.
  4. 쓰레드 수 조정:

    • 현재 코드에서 스레드 풀을 10개로 설정하여 실행하고 있습니다. 이 수치 또한 메모리 사용에 영향을 미칠 수 있으므로 필요에 따라 조정해야 할 수 있습니다.

위의 문제들과 관련된 추가 자료나 유사한 해결 사례

위의 해결 방법을 기반으로 구체적인 설정을 테스트한 후, 더 많은 정보를 얻으시려면 아래 유사한 문제 해결을 다룬 자료들을 참고하세요:

저는 질문자님의 이해를 돕고자 기존의 지식공유자님의 답변을 참고하여 유사한 해결 링크와 추가 설명을 제공합니다. 현재 베타 기능으로 답변이 충분치 않을 수 있는 점 양해 부탁드리며, 추가적으로 궁금한 점이 있으시면 자유롭게 질문해 주세요. 곧 지식공유자께서 추가적인 답변을 제공해 주실 것입니다.

MinKyu Song님의 프로필 이미지
MinKyu Song

작성한 질문수

질문하기