본문 바로가기
IT/JAVA

CompletableFuture 를 이용한 Mybatis 쿼리 여러개 동시 수행

by 최고영회 2022. 6. 24.
728x90
반응형
SMALL

{dd} 별로 로그성 테이블이 있고 6월 한달동안의 데이터를 조회해서 보고서용 데이터를 합계 하려고 할 때 

 

1. 일배치를 통해 매일 요약본을 만들고 해당 데이터를 이용하여 하나의 테이블에 insert 한 후 한번에 쿼리할수도 있고 

2. 배치수행을 하지 않고 필요할 때만 조회해서 조합할수도 있다. 

 

2번으로 진행해야 할 경우 {dd} 테이블의 데이터를 6월 1일부터 현재날짜까지 반복해서 조회해야 하고 

조회한 결과를 collection 에 담아 이후 작업을 진행해야 한다. 

 

{dd} 테이블 조회 쿼리 수행이 느린 경우 그리고 이와 같은 상황 (많은 테이블에 select 해야 하는 경우)에서는 각 쿼리 수행을 async 하게 수행하고 결과를 merge 하면 된다. 

 

Future, ListenableFuture, CompletableFuture 중 callback 이 아닌 가장 쉽게 할수 있는 CompletableFuture 의 allOf 를 이용하면 간단히 해결할 수 있다. 

 

List<LogDto> totalList = Collections.synchronizedList(new ArrayList<>());

List<CompletableFuture<List<LogDto>>> listByDay = new ArrayList<>();
for (int i=0; i<10; i++) {
  CompletableFuture cf = CompletableFuture.runAsync(()-> totalList.addAll(dao.getLogByDay()));
  listByDay.add(cf);
}
CompletableFuture.allOf(listByDay.toArray(new CompletableFuture[listByDay.size()])).join();

return totalList;

[코드 설명]

- 전체 데이터를 담을 totalList 선언

- 각 날짜별 로그 데이터 결과를 담을 listByDay 

- 예시로 1부터 10까지 loop

- dao.getLogByDay() 해서 해당 날짜의 데이터 조회를 CompletableFuture 의 runAsync 로 async 하게 호출하고 

  결과를 totalList 에 add 

- CompletableFuture.allOf, join을 이용하여 loop 돌면서 결과로 받은 CompletableFuture 가 모두 종료될때까지 대기 

 

728x90
반응형
LIST

'IT > JAVA' 카테고리의 다른 글

How can I get jar file's Implementation version  (0) 2023.02.20
java with cpulimit & visualvm 으로 확인  (0) 2022.07.19
Ehcache Event Listener  (0) 2021.09.13
Java ProcessBuilder cd 로 이동  (0) 2021.07.23
EventSource IE 처리 (Feat. Polyfill)  (0) 2021.05.07