Java peut traiter en parallèle, mais je ne sais pas grand-chose à ce sujet, j'ai donc exécuté Parallel Stream et Completable Future, que je pense utiliser souvent.
Traitement pour récupérer les données de DB sur AWS individuellement avec findById à partir de 30 ID.
local
AWS RDS
Serial
List<Long> list = createIdList(); //30 caisses
List<Currency> currencies = new ArrayList<>();
list.forEach(id -> currencyService.findById(id)
.ifPresent(currency -> currencies.add(currency)));
résultat
3644ms
ParallelStream
ParallelStream
List<Long> list = createIdList(); //30 caisses
List<Currency> currencies = new ArrayList<>();
list.parallelStream()
.forEach(id -> currencyService.findById(id)
.ifPresent(currency -> currencies.add(currency)));
résultat
607ms
CompletableFuture
CompletableFuture
List<Long> list = createIdList(); //30 caisses
List<Currency> currencies = new ArrayList<>();
ExecutorService ex = Executors.newWorkStealingPool();
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (long id : list) {
futures.add(CompletableFuture.runAsync(() -> currencyService
.findById(id).ifPresent(c -> currencies.add(c)), ex));
}
CompletableFuture.allOf((futures.toArray(new CompletableFuture[futures.size()]))).join();
résultat
604ms
Au fait, quand j'ai essayé d'en faire un seul thread avec ʻExecutors.newSingleThreadExecutor (); `, c'était 4123ms.
Dans cette expérience, nous allons transmettre des données à RDS, mais il semble que nous devions être prudents lors de la connexion externe avec Parallel Stream. http://taichiw.hatenablog.com/entry/2018/09/30/224907
Aussi, je l'ai ajouté à la liste dans la boucle, mais il semble que ce n'est pas bon car c'est un soi-disant effet secondaire.
Recommended Posts