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