spring data jpa 대량 삽입,대량 업데이트 문제 분석 시작
한 중 일 만 이 대규모 Mybatis(중국의 아웃 소 싱 이 라 고 심각하게 의심 합 니 다)를 사용 하고 있 기 때문에 이상 합 니 다.중국의 IT 기술 이 점점 고 개 를 들 고 있다 고 하지만 이 사회 IT 발전의 주 도 는 현재 로 서 는 미국,유럽 입 니 다.여기 JPA,Hibernate 가 절대적 인 주류 입 니 다.그러면 저 는 JPA 를 위주 로 개발 하 는 것 이 제 다음 개인 프로젝트 의 선택 이 라 고 생각 합 니 다.
그러면 며칠 동안 간단 한 모색 을 통 해 JPA 는 매우 유용 하 다 고 할 수 있다.특히 DDD 디자인 사상 은 현재 spring boot,마이크로 서비스의 디자인 이념(개인 적 인 견해 만 대표)에 완벽 하 게 부합된다.
그런데 사용 하 는 과정 에서 문제 가 생 길 수 있 습 니 다.제 가 전에 쓴 파충류 의 삽입 효율 이 매우 낮 습 니 다.한편 으로 는 제 서버 에서 Mysql 의 표현 이 매우 좋 지 않 기 때 문 입 니 다.자세 한 내용 은 보 세 요.
[평가]저 배합 환경 에서 PostgresQL 과 Mysql 의 읽 기와 쓰기 성능 을 간단하게 비교 합 니 다(Mysql 최적화 의견 을 제시 하신 것 을 환영 합 니 다)
다른 한편,JPA 의 대량 삽입 소스 코드:
이 saveaAll 은 분명히 save 방법 을 순환 적 으로 호출 한 것 입 니 다.간단 한 테스트 삽입 데이터 방법 을 써 보 겠 습 니 다.
우 리 는 Hibernate 를 열 어 sql 로 그 를 표시 합 니 다.출력 결 과 를 보십시오.
로 그 를 보면 JPA 는 모든 데 이 터 를 먼저 찾 아 냈 고 데이터베이스 가 있 으 면 업데이트 하고 없 으 면 새로 추가 합 니 다.아 리 의 감 시 를 다시 한 번 살 펴 보 겠 습 니 다.만약 이 글 속 의 방법 에 따라 어 울 릴 수 있 습 니 다.
springboot 2.0 연결 풀 설정(hikari,druid)
나 는 다섯 개의 데 이 터 를 꽂 았 는데,결 과 는 10 번 sql 을 실 행 했 습 니 다.이것 은 정말 입 니까?이해 가 안 돼 요.제 가 너무 못 했 나 봐 요.나 는 스 크 립 트 를 뛰 어서 적어도 수천 개의 데 이 터 를 창고 에 꽂 았 는데,이런 방법 은 나 에 게 매 운 닭 데이터 베 이 스 를 써 서 죽여 야 한다.
그리고 이렇게 효율 도 너무 낮 죠?검색 은 in 을 사용 하지 않 을까요?insert 는 sql 을 맞 출 줄 모 릅 니까?그리고 많은 장면 을 제 가 삽입 하 는 지 새로 추가 하 는 지 제어 할 수 있 습 니 다.저 는 당신 이 저 에 게 한 번 검사 해 줄 필요 가 없습니다.저 는 조용히 데 이 터 를 삽입 하고 싶 습 니 다.그러면 방법 이 있 습 니까?있 습 니 다.
프로필 에 추가:
spring.jpa.properties.hibernate.jdbc.batch_size=500
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates =true
이 batch size 는 당신 의 데이터 베 이 스 를 1 초 에 최대 쓰기/2 로 설정 하 는 것 을 권장 합 니 다.단지 나 자신 이 이렇게 좋 은 것 을 느 낄 이유 가 없습니다.reposcory 에서 두 개의 인터페이스 batch Save,batch Update 를 정의 하고 실현 합 니 다.
@Override
@Transactional
public <S extends T> Iterable<S> batchSave(Iterable<S> var1) {
Iterator<S> iterator = var1.iterator();
int index = 0;
while (iterator.hasNext()){
em.persist(iterator.next());
index++;
if (index % BATCH_SIZE == 0){
em.flush();
em.clear();
}
}
if (index % BATCH_SIZE != 0){
em.flush();
em.clear();
}
return var1;
}
@Override
public <S extends T> Iterable<S> batchUpdate(Iterable<S> var1) {
Iterator<S> iterator = var1.iterator();
int index = 0;
while (iterator.hasNext()){
em.merge(iterator.next());
index++;
if (index % BATCH_SIZE == 0){
em.flush();
em.clear();
}
}
if (index % BATCH_SIZE != 0){
em.flush();
em.clear();
}
return var1;
}
그 다음 에 대량으로 삽 입 된 입 구 를 약간 바 꾸 고 방금 실현 한 batchSave 호출 방법 으로 바 꿉 니 다.결 과 를 실행 해 봅 시다.
이번 500 개 는 778 밀리초 로 이전 5 개 712 와 차이 가 많 지 않 았 지만 콘 솔 에서 500 개의 삽입 문 구 를 인쇄 한 것 을 보 았 습 니 다.이 로 인해 저 는 일괄 삽입 이 실패 한 줄 알 았 습 니 다.이치 대로 말 하면 시간 이 성공 한 것 같 습 니 다.그래서 나중에 아 리 의 감 시 를 설 치 했 습 니 다.
안심 하 세 요.Hibernate 의 로그 인쇄 에 문제 가 있어 서 나중에 Hibernate 로그 인쇄 를 껐 습 니 다.아 리 의 druid 에 전념 했 습 니 다.
여기 서 spring data jpa 가 대량 삽입,대량 업데이트 에 관 한 글 을 소개 합 니 다.더 많은 spring data jpa 가 업데이트 내용 을 삽입 하 는 것 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.