Я разрабатываю приложение spring -mvc.

У меня есть требование обработки более 100 тыс. записей данных. И я не могу сделать его зависимым от базы данных, поэтому мне нужно реализовать всю логику в java.

На данный момент я создаю количество потоков и назначаю, скажем, 1000 записей каждому потоку для обработки.

Я использую org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.

Пункт списка

Вопрос:

  1. Предлагаемое количество потоков, которые я должен использовать.
    • Должен ли я поровну разделить количество записей между потоками или
    • Должен ли я предоставить предопределенное количество записей для каждого потока и увеличить количество потоков?
  2. ThreadPoolTaskExecutor в порядке или я должен использовать что-то еще?
  3. Должен ли я поддерживать идентификаторы записей, которые назначаются каждому потоку в java или в базе данных? (Примечание: при использовании базы данных я делаю дополнительный вызов базы данных для каждой записи и обновляю ее после обработки этой записи)

Может ли кто-нибудь предложить мне лучшие практики в этом сценарии.

Любое предложение будет отличным.

Примечание. Основное внимание уделяется времени выполнения.

Обновление:

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

2
Naman Gala 5 Ноя 2014 в 10:18
2
Каков баланс между вычислениями и вводом-выводом? Если вы просто запустите его с одним потоком, насколько загружен процессор (или процессоры)? У многопоточности есть издержки - ОС может лучше выполнять предварительную выборку, если вы читаете по порядку.
 – 
Patricia Shanahan
5 Ноя 2014 в 10:22
6
Все зависит от того, что означает «обработка записи». Привязана ли задача к IO или CPU? Если вам нужно подключение к базе данных для каждого потока, сколько подключений к базе данных у вас есть в вашем пуле? Вы измеряли время, необходимое для использования одного потока? Потому что 100 000 это не так уж много.
 – 
JB Nizet
5 Ноя 2014 в 10:24
Пожалуйста, найдите мой обновленный вопрос.
 – 
Naman Gala
5 Ноя 2014 в 10:37
Пока я разрабатываю локально, сейчас я не могу сказать, сколько у меня будет подключений к серверу. Моя самая большая проблема со временем — это вызовы базы данных.
 – 
Naman Gala
5 Ноя 2014 в 10:43
Вызов базы данных 100K (даже с потоками) займет огромное количество времени. Вы не можете переосмыслить процесс?
 – 
yunandtidus
5 Ноя 2014 в 11:38

2 ответа

Для обработки огромных объемов данных вы можете использовать среду Spring Batch.
Ознакомьтесь с этим документом.
Wiki страница.

1
Raj_89 5 Ноя 2014 в 10:41

ExecutorService должен подойти вам, не нужно использовать spring. А вот номер нити будет подвохом. Я могу только сказать, это зависит от того, почему бы не попробовать вычислить оптимизированное число?

0
sanigo 5 Ноя 2014 в 11:03