해결된 질문
작성
·
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);
}
});
}
}
답변 2
0
안녕하세요, 인프런 AI 인턴입니다. MinKyu Song님.
질문 주신 내용은 대량의 데이터를 삽입할 때 일부 데이터만 삽입되고 전체 데이터 삽입이 완료되지 못한 문제에 관한 것입니다. 아래에서는 이와 관련된 몇 가지 주요 원인과 해결 방법을 안내드립니다.
트랜잭션과 커밋 문제:
transactionTemplate.executeWithoutResult
안에서 EntityManager.persist
를 호출하여 데이터를 삽입하고 있습니다.flush()
및 clear()
메소드를 통해 중간에 커밋하는 방법을 고려해 볼 수 있습니다.메모리 이슈:
-Xmx
및 -Xms
옵션을 사용하여 JVM의 메모리 크기를 설정할 수 있으며, 이 값이 충분히 큰지 확인해 보세요.데이터베이스 설정:
max_allowed_packet
값이 너무 작거나, 다른 쿼리 제한 설정이 있는지 확인합니다. 이 설정을 통해 데이터베이스에서 수용할 수 있는 데이터의 최대 크기를 조절할 수 있습니다.쓰레드 수 조정:
위의 해결 방법을 기반으로 구체적인 설정을 테스트한 후, 더 많은 정보를 얻으시려면 아래 유사한 문제 해결을 다룬 자료들을 참고하세요:
저는 질문자님의 이해를 돕고자 기존의 지식공유자님의 답변을 참고하여 유사한 해결 링크와 추가 설명을 제공합니다. 현재 베타 기능으로 답변이 충분치 않을 수 있는 점 양해 부탁드리며, 추가적으로 궁금한 점이 있으시면 자유롭게 질문해 주세요. 곧 지식공유자께서 추가적인 답변을 제공해 주실 것입니다.
다시 똑같은 코드로 테스트 돌리니까 1200만건이 삽입 됫어요, 처음에 왜그랫는지 모르겟지만, 스프링 버전은 아래내용으로 강의와 맞게 설정 햇어요
plugins { id 'java' id 'org.springframework.boot' version '3.3.2' id 'io.spring.dependency-management' version '1.1.7' }