일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 카프카
- JPA
- querydsl
- JPA스터디
- 코테준비
- 스프링부트
- 자료구조공부
- JPA 공부
- 플러터 공부
- 프로그래머스
- 스프링부트공부
- K8S
- JPA예제
- 스프링
- JPA공부
- 코테공부
- Kafka
- Flutter
- nestjs
- nestjs스터디
- 스프링공부
- 스프링 공부
- 알고리즘공부
- 플러터 개발
- 자바공부
- nestjs공부
- DDD
- 기술면접공부
- Axon framework
- 기술공부
- Today
- Total
DevBoi
[JPA] save, saveall의 성능차이 본문
save와, saveall의 동작 차이
-save
-기존 트랜잭션이 존재하는경우
save를 호출하는 경우, 트랜잭션이 존재 경우, 기존 트랜잭션에 참여하게 된다.
기존 트랜잭션에 참여하지만, spring의 프록시 로직을 타게된다.
-기존 트랜잭션이 없는 경우
생성후 종료된다. -> 리소스 소모가 크다.
-saveAll
-기존 트랜잭션이 존재하는 경우 기존 트랜잭션에 참여한다.
-saveAll->save를 호출하지만, 같은 인스턴스 내에서 호출하기 때문에 프록시 로직을 타지 않는다.
save로직이 한건당 프록시 로직을 매번 탈수도있고, saveall로 하게되는 경우 같은 인스턴스 내에서 호출 되기 때문에
건당 프록시 로직을 타지않게 된다.
1000건이라고 가정하면, 프록시 로직을 천번을 매번 타는것과, 한번만 타고 1000건 처리하는 것은 다르다.
<참고>
save() 동작 원리
entity가 새로 생성할 예정이라면, persist를 호출(insert 쿼리 발생), 그렇지 않다면, merge
<Entity를 new 로 인식하는 경우>
1. ID : null 또는 0일 경우 new 상태로 인식한다.
Wrapper일 경우 null을 newState로 인식하고, int와 같은 Primitive일 경우 new 상태로 인식한다.
2.Version : Entity 필드에 Version이라는 것이 달려있는데, 해당 필드가 null이면, new로 간주한다.
@Version은 Entity에 Lock을 걸고싶을 때 사용한다.
3.Persistable interface를 구현한것
isNew method에 따라서 new여부를 판단한다.
'Develop > [JPA]' 카테고리의 다른 글
[JPA]QueryDSL 사용이유, 정의 (0) | 2022.03.20 |
---|---|
[JPA] ID를 Long으로 하는 이유 (0) | 2022.03.20 |
[JPA] 패치조인이란 (0) | 2022.03.20 |
[JPA] N+1 문제란 (0) | 2022.03.18 |
[JPA] JPA 동작과정 (조회,저장, 수정) (0) | 2022.03.17 |