Как заставить приведенный ниже код работать быстрее при использовании параллельного программирования? - PullRequest
0 голосов
/ 19 декабря 2018

Я пишу контроллер с использованием SpringBoot, мой контроллер выглядит следующим образом

@RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
public MyDto getData throws Exception{

    try{

        Mydto=new MyDto();
        dto.setFirstName(someImpl.getFirstName());
        dto.setLastName(someOtherImpl.getLastName());

        dto.setAddress1(someImpl.getAddress1());
        dto.setAddress2(someOtherImpl.getAddress2());
        return dto;

       }catch(){...}

Здесь someImpl и someOtherImpl - это интерфейсы, в которых он содержит некоторые методы, мы выбираем getFirstName и getLastName из базы данных, но getAddress1 и getAddress2 - это жестко заданное значение, как я могу сделать первые два установщика (имя и фамилия) для запуска в одном потоке, а последние двасеттеры (Address1 и Address2) для работы в другом потоке, поэтому я могу сократить время на выборку своих данных.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

логика есть, SomeImpl извлечет ~ 15 записей из БД, которые будут отправлены в mapper, mapper отфильтрует ~ 5 полей из 15, затем установит эти 5 значений в Dto.

, что вам нужно указать заранее

Извлечение 15 записей из БД занимает 10 секунд ... это слишком много.Я все еще предполагаю, что проблема где-то еще, пока вы не докажете обратное

Здесь мы будем предполагать, что параллельная обработка поможет вам (переключение и управление потоками займет меньше, чем каждая операция).Обратите внимание, что параллельное чтение данных из базы данных может помочь вам меньше, чем вы ожидаете.Другими словами - это то, как выполнять операции параллельно, но я все еще не верю, что это решит вашу проблему.

Вы действительно можете прочитать ресурсы из комментария

Решениебудет использовать CompleatableFuture для извлечения деталей и установки их в dto.Проверьте Руководство по CompletableFuture для подробностей - Валентин Карну

Вы можете использовать службу исполнителя с фиксированным пулом потоков

private static final ExecutorService fetchService = Executors.newFixedThreadPool(threadCount);

Отправить свои задачи

final Mydto myDto =new MyDto();
Collection<Future> futures = ...
futures.add(fetchService.submit(() -> { myDto.setSometing(...); }));
futures.add(fetchService.submit(() -> { myDto.setSometingElse(...); }));
// wait until all completes assuming no other thread submit tasks
futures.forEach(f->{f.get();});

Я написал это из своей головы без правильной проверки синтаксиса, но у вас должна быть идея

0 голосов
/ 19 декабря 2018

Если это то, что вы хотите, то

Вы можете обернуть каждую строку с помощью new Thread().start(), но это может быть даже медленнее, чем сейчас.Попробуйте:

Mydto=new MyDto();
new Thread(() -> {
     dto.setFirstName(someImpl.getFirstName());
     dto.setLastName(someOtherImpl.getLastName());
}).start();

new Thread(() -> {
     dto.setAddress1(someImpl.getAddress1());
     dto.setAddress2(someOtherImpl.getAddress2());
}).start();
return dto;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...