Java kann parallel verarbeitet werden, aber ich weiß nicht viel darüber. Deshalb habe ich Parallel Stream und Completable Future ausgeführt, die ich meiner Meinung nach häufig verwende.
Verarbeitung zum individuellen Abrufen von Daten aus der Datenbank in AWS mit findById aus 30 IDs.
lokal
AWS RDS
Serial
List<Long> list = createIdList(); //30 Fälle
List<Currency> currencies = new ArrayList<>();
list.forEach(id -> currencyService.findById(id)
.ifPresent(currency -> currencies.add(currency)));
Ergebnis
3644ms
ParallelStream
ParallelStream
List<Long> list = createIdList(); //30 Fälle
List<Currency> currencies = new ArrayList<>();
list.parallelStream()
.forEach(id -> currencyService.findById(id)
.ifPresent(currency -> currencies.add(currency)));
Ergebnis
607ms
CompletableFuture
CompletableFuture
List<Long> list = createIdList(); //30 Fälle
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();
Ergebnis
604ms
Übrigens, als ich versuchte, es mit "Executors.newSingleThreadExecutor ();" zu einem einzigen Thread zu machen, waren es 4123 ms.
In diesem Experiment werden wir Daten an RDS senden, aber es scheint, dass wir vorsichtig sein müssen, wenn wir eine externe Verbindung mit Parallel Stream herstellen. http://taichiw.hatenablog.com/entry/2018/09/30/224907
Ich habe es auch zur Liste in der Schleife hinzugefügt, aber es scheint nicht gut zu sein, da es sich um einen sogenannten Nebeneffekt handelt.
Recommended Posts