Использование BlockingQueue с сервлетом для сохранения объектов - PullRequest
0 голосов
/ 02 июня 2011

Во-первых, это может быть глупый вопрос, но я надеюсь, что кто-то мне так скажет и почему. Я также прошу прощения, если мое объяснение того, что / почему не хватает.

Я использую сервлет для загрузки ОГРОМНОГО (247 МБ) файла, который обозначен как труба (|). Я беру около 5 из 20 полей, создаю объект и добавляю его в список. Как только это будет сделано, я передаю список в транзакционный метод OpenJPA с именем persistList ().

Это было бы хорошо, за исключением размера файла. Это занимает вечность, поэтому я ищу способ улучшить его. У меня была идея использовать BlockingQueue в сочетании с методом persist / persistList в новом потоке. К сожалению, мои навыки в параллельности Java немного слабые.

Имеет ли смысл то, что я хочу сделать? Если так, кто-нибудь делал что-то подобное раньше?

1 Ответ

4 голосов
/ 02 июня 2011

Сервлеты должны отвечать на запросы в короткие сроки.В этом случае постоянство содержимого файла должно быть асинхронным заданием, поэтому:

  1. Сервлет должен ответить текстом о задании загрузки, ожидаемом времени выполнения или чем-то в этом роде.
  2. Загруженный контент должен быть записан в некоторое временное пространство в двоичном виде, а не храниться в памяти.Это обычный способ работы многосоставных почтовых библиотек.
  3. У вас должна быть отдельная служба, которая блокирует очередь ожидающих заданий.Получив задание, он обрабатывает его.
  4. «Задание» - это просто некоторый дескриптор временного файла, который был записан во время загрузки ... и любых метаданных, например, кто его загрузил, идентификатор задания и т. Д..
  5. Постоянному сервису необходимо загрузить большое количество строк, но сделать его «атомарным», либо моделировать промежуточное состояние как часть модели (ей) таблицы, либо записывать во временные пробелы.
  6. Если вы пишете во временные таблицы, а затем копируете все содержимое в оперативную таблицу, не забудьте иметь достаточно места для журнала и временного пространства на уровне базы данных.
  7. Если у вас есть полный стек J2EEрассмотрите возможность моделирования очереди заданий как очереди JMS, чтобы восстановление имело смысл.Еще раз, не забудьте иметь правильные границы XA, чтобы все строки сохранялись в пределах внешней транзакции.
  8. Наконец, рассмотрите также наличие API проверки состояния и / или пользовательского интерфейса, где вы можете определить состояние любого конкретногозадание загрузки: Ожидание / Обработка / Завершено.
...