Какая очередь блокировки Java лучше всего подходит для сценариев с несколькими производителями и с одним или несколькими потребителями? - PullRequest
2 голосов
/ 07 августа 2009

Какая очередь блокировки Java лучше всего подходит для сценариев с несколькими производителями и с одним или несколькими потребителями?

Я тестирую с LinkedBlockingQueue, но получаю исключение OutOfMemoryError.

Я пытаюсь добиться следующих вещей.

  1. продюсер создает объект и ставит в очередь.
  2. потребитель получает данные из очереди и вставляет их в базу данных. Было бы 400 производителей, и я могу настроить потребителей по своему желанию.

Дайте мне знать любую идею.

Обновление

Производитель: он должен слушать Server Socket. Он читает данные из сокета и создает объект (доменные объекты) и помещает их в очередь.

Потребитель: взять объект из очереди и вставить в БД (поддерживается Hiberante и пул соединений)

Это моя настоящая среда. Процесс должен иметь возможность обрабатывать не менее 200 записей в секунду. Я проверяю масштабируемость процесса и способы его улучшения. Я надеюсь, что это даст лучшую идею.

Полезные ссылки:

vmoptions

Мониторинг и управление приложениями на платформе Java SE 6

BlockingQueue

Ответы [ 3 ]

5 голосов
/ 07 августа 2009

Проблема не в том, какую Queue реализацию вы используете, а в том, как подойти к проблеме регулирования ваших производителей , если ваши потребители не могут идти в ногу . Одним из возможных решений является создание LinkedBlockingQueue с фиксированной емкостью, и ваши производители должны вызвать offer(E e), который вернет false, если очередь заполнена.

Другим возможным решением является согласование количества производителей и потребителей.

2 голосов
/ 07 августа 2009

Является ли каждый производитель отдельным потоком? Не забывайте, что каждый поток выделит (по умолчанию) 512 КБ памяти для своего стека (в вашем случае требуется 200 МБ памяти ВМ только для потоков). Вы можете уменьшить это с помощью -Xss.

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

1 голос
/ 07 августа 2009

Кажется, что LinkedBlockingQueue - лучший выбор для вашей проблемы. Я бы посоветовал вам запустить вашу программу с ключом -XX: + HeapDumpOnOutOfMemoryError и проанализировать файл дампа, чтобы увидеть, что вызвало проблему. Тогда вы сможете решить ее намного проще.

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