У меня есть таблица DynamoDB, в которой у меня более 1000 строк. Мне нужно написать приложение springboot, которое считывает строки таблицы одну за другой и выполняет вызов другой службы, которая принимает по одному JSON за раз. Перебирать таблицу 1 на 1 не кажется оптимальным решением. Можно ли этого добиться с помощью многопоточности, если да, то как это можно сделать? Или у нас есть лучший вариант для этого, может кто-нибудь поможет?
Попробуйте использовать Spring-Batch с параллельной обработкой. Предполагая, что ваши строки можно читать независимо. docs.spring.io/spring-batch/trunk/reference/html/…
Вместо того, чтобы читать одну строку или все сразу, чтение в пакете с последующим добавлением их в пул было бы еще одним хорошим подходом. В этом случае вы не застрянете из-за сети или поиска огромных данных. Кроме того, сохранение определенного количества потоков также улучшит производительность.




В то время, когда вы можете читать, предположим, N записей за раз, например, из 50, вы можете использовать более 1 потока для чтения записей из базы данных, поскольку вы только читаете, а не пишете, после того, как вы прочитали запись, вы можете создать N номер потоков для вызова внешней службы из ExecutorService, и каждая служба Thread of Executor может иметь данные одной записи, которая будет вызывать эту внешнюю службу
Не могли бы вы привести мне пример или ресурс о том, как это можно сделать?
Вы можете использовать @async. Это один из самых простых способов выполнения нескольких потоков в Springboot.
Я использую JPA для доступа к БД. Так что мне все равно придется использовать все записи. findAll () и сохраните их в списке. А затем для каждого элемента в списке мне нужно выполнить цикл и сделать остальной вызов, используя этот элемент. Я могу использовать Async для этого вызова. Можно ли получить каждый элемент один за другим асинхронно и сделать остальной вызов, а затем перейти к следующему элементу в базе данных и сделать то же самое
Интересно то же самое.
Прежде всего, почему вам нужно читать таблицу БД одну строку за другой? у вас может быть только один оператор sql и получить все нужные строки (достигнутые на уровне вашего репозитория, если это приложение для весенней загрузки), а затем использовать многопоточность, как описано другими людьми (@Async, ExecutorService и т. д.) в ваши классы обслуживания.
Загляните в ThreadPoolExecutor. Вы можете прочитать все записи из базы данных и добавить каждую как задание в ThreadPoolExecutor, который будет использовать несколько потоков для выполнения вызовов REST.