Использование многопоточности в пакетном задании JDBC - PullRequest
0 голосов
/ 23 декабря 2011

У нас есть пакетное задание JDBC. Есть две таблицы:

  • BUSINESS_CONTRACT
  • CLASSIFY_RECORD

В таблице BUSINESS_CONTRACT хранится информация о бизнес-контрактах, мы классифицируем бизнес-контракты каждый месяц и сохраняем результаты классификации в таблице CLASSIFY_RECORD.

Пакетное задание запускается один раз в месяц, запрос BUSINESS_CONTRACT для этих бизнес-контрактов необходимо классифицировать и классифицировать, а затем вставить результаты классификации в CLASSIFY_RECORD.

Пакетное задание выполняется в одном потоке прямо сейчас, и я хочу, чтобы оно выполнялось с многопоточностью

Как мне написать базовую структуру кода, используя шаблон диспетчер-работник?

Я изучаю многопоточность Java, но в основном нашел теоретические ресурсы. Теперь я хочу использовать многопоточность для решения реальной проблемы, но не знаю, как написать код первой строки.

Ответы [ 2 ]

2 голосов
/ 23 декабря 2011

Во-первых, вам нужна дополнительная сложность многопоточности?Сколько времени занимает ваш текущий процесс?Есть ли у вас несколько процессоров или несколько процессорных ядер на сервере, на котором вы будете его запускать, что сделает многопоточность выгодной?

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

Как бы вы сделали эту работу вручную?Предположим, у вас были эти записи в виде бумажных документов, и вам пришлось разделить задачу с коллегой.Как бы вы поделили работу?Между 2 или 20 людьми?(Вот сколько потоков вы могли бы разделить на это.)

Как только вы выяснили эти детали, вы можете создать несколько потоков (ваших работников, используя родительский код "диспетчера"), каждый из которых настроен на выбор толькочасть результатов по вашему запросу.Вам следует сохранять ссылки на каждый из ваших потоков и вызывать .join() для каждого из них после их запуска, чтобы дождаться завершения всего пакета.Если имеется большой объем данных, которые будет трудно разделить на равные единицы работы (1000 записей, разделенных на 500 и 500, по любой причине могут потребовать 75% и 25% ресурсов), вы можете рассмотреть возможность разделения работы.в гораздо меньшие единицы (больше единиц, чем потоков), тогда диспетчер продолжит передавать единицы работы рабочим, пока вся работа не будет назначена.

Также подумайте, будут ли эти разделенные функции работы действительно отличаться?Если по какой-либо причине происходит сбой одной единицы работы и ее необходимо откатить в базе данных, означает ли это, что все другие единицы работы необходимо остановить и откатить любые существующие операции вставки?

0 голосов
/ 23 декабря 2011

Используете ли вы пакетные обновления? Это, вероятно, будет иметь большее значение, чем несколько потоков, выполняющих отдельные обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...