JpaPagingItemReader
120
작성자 없음
작성한 질문수 0
humanThreatDataReader는 스레드 안전한 JpaPagingItemReader를 사용했다.
라는 구문에서 헷갈리는게 있는데 JpaPagingItemReader의 경우는 lock을 걸지 않는데 SynchronizedItemStreamReader 데코레이터를 적용해야하지 않나요???
답변 2
1
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[SYSTEM INVESTIGATION INITIATED]
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
[KILL-9]: "lock을 걸지 않는다라... 확인해볼까? 💀 "
**TARGET ACQUIRED: JpaPagingItemReader**
훌륭한 질문이다! 하지만 놈이 숨기고 있는 진실을 파헤쳐보자.
JpaPagingItemReader는 페이지 읽기에 직접적으로 lock을 사용하지 않는다. 하지만...
** 부모 클래스 AbstractPagingItemReader의 doRead() 코드를 보자:(6장 작전1에서 설명했듯이 JdbcPagingItemReader도 이녀석을 상속했었지.)**
```java
@Nullable
@Override
protected T doRead() throws Exception {
this.lock.lock(); // ← 이놈이다! ReentrantLock 발견!
try {
if (results == null || current >= pageSize) {
if (logger.isDebugEnabled()) {
logger.debug("Reading page " + getPage());
}
doReadPage(); // JpaPagingItemReader#doReadPage() 호출
page++;
if (current >= pageSize) {
current = 0;
}
}
int next = current++;
if (next < results.size()) {
return results.get(next);
}
else {
return null;
}
}
finally {
this.lock.unlock(); // ← 여기서 ReentrantLock 해제!
}
}
💀 결론: JpaPagingItemReader는 데이터 읽기 측면에서 Thread-Safe하다! 부모 클래스에서 ReentrantLock으로 동기화를 보장하고 있기 때문에 SynchronizedItemStreamReader 데코레이터가 불필요하다.
💀 P.S: 혹시나 하고 예제를 다시 살펴보니 saveState가 false로 잘 설정되어있구나.
6장 작전1에서 설명한 스프링 배치의 두 가지 측면에서의 스레드 안정성 모두를 만족했다.
[THREAD SAFETY: CONFIRMED]
-1
안녕하세요, 인프런 AI 인턴입니다.
이동연님, JpaPagingItemReader의 스레드 안전성과 관련된 좋은 질문을 주셨습니다. 일반적으로, JpaPagingItemReader는 스레드 안전하지 않기 때문에 멀티스레딩으로 사용할 경우 문제가 생길 수 있습니다. 이를 해결하기 위해 SynchronizedItemStreamReader와 같은 데코레이터를 사용하여 스레드 안전성을 보장하는 방식을 사용할 수 있습니다.
JpaPagingItemReader의 특징
- 스레드 관리: JpaPagingItemReader는 기본적으로 스레드 안전하지 않습니다. 데이터 페이지를 읽는 동안 상태를 관리하므로 멀티스레드 환경에서는 주의가 필요합니다.
- SynchronizedItemStreamReader 사용: 멀티스레드 환경에서 안전하게 데이터를 읽기 위해서는 SynchronizedItemStreamReader를 적용하여 Reader의 접근을 동기화하는 것이 권장됩니다.
이와 관련해, 기존에 유사한 질문을 다룬 게시물이 있으니 참고하시면 도움이 될 것입니다:
이 답변이 도움이 되셨기를 바라며, 추가적인 질문이 있으시면 언제든지 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
형 이번에 낸 책이랑 강의 내용에 차이가 있어?
1
51
1
형 나 몰래 책내면 모를 줄 알고?
1
38
1
강의 중복 확인 요청
0
30
1
중복내용 제보?!
1
52
2
Json 요청 처리
1
52
2
[건의][6장][작전1] deprecated 메소드
1
55
2
[예제][3장][작전2] windows 에서 마지막 예제
0
43
1
[오타][3장][작전1] 형 이건 빨리 해줘
2
112
2
[오타] "리스너 활용: 시스템 완전 장악 매뉴얼" 부분
1
68
1
[오타] "JobScope와 StepScope 사용 시 주의사항" 부분
1
70
2
spring boot 4 + spring batch 6 설정 변경?
1
120
2
Batch 패키지 설계 — 실무에서 Job 단위 구조
1
103
1
Spring batch를 실행해줄 스케줄러와 batch 실행 환경
1
93
1
메타테이블에 데이터가 생기지 않는 이유
1
122
2
Spring Batch 4.3.10 ExecutionContext 한글 인코딩 이슈 관련 문의
1
119
2
@StepScope 또는 @JobScope와 JobOperator
1
156
5
Remote Partitioning
1
114
2
킬구형 실무에서는 JPA ItemReader / ItemWriter를 더 선호해? 아니면 JDBC itemReader/ItemWriter를 더 선호해?
1
146
2
병렬 중첩
1
107
3
형 코드에 public static class 이게 뭐야 ?
1
144
3
ExitStatus
1
72
2
Batch6: jobOperator.startNextInstance() throws UnexpectedJobExecutionException
1
130
5
jdbc 커서, 페이징에서 일대다 관계 데이터 뻥튀기 조회 처리 방법 질문
1
125
2
SkipPolicy는 여러번 불릴 수 있는가?
1
58
2





