2016-05-12 1 views
0

У меня есть клиент-серверное приложение Corba. Для некоторых вызовов сервер предоставляет объект-итератор Клиенту, поскольку возвращаемые данные огромны. Текущая реализация - сервер извлекает все релевантные данные из базы данных (MySQL) и сохраняет память до тех пор, пока клиент не завершит извлечение всех данных (через вызовы getNext_n getNext_n()). Уже существует ограничение на общее число итераторов и его продолжительность жизни (шаблон Evictor). Теперь сервер иногда выходит из памяти, если большинство открытых итераторов имеют огромные данные.Сбор данных из MySQL для Corba Iterator

  1. Что было бы лучшим способом справиться с таким сценарием?
  2. Мы можем вместо этого извлекать данные из БД кусками (используя Limit) вместо кэширования локально. Но, если какой-либо другой поток вставляет/удаляет строки в таблице; выбор будет возвращать несогласованные данные. Использование временной таблицы в свою очередь означает дополнительное использование диска. Предоставляет ли MySQL какой-либо другой механизм для обработки такого сценария?

ответ

0

Вам не нужно ничего хранить из MySQL на сервере Corba. Вы можете выполнить запрос MySQL на сервере и отправить итератору клиенту. Затем вы получаете строку из набора результатов запроса MySQL и сразу же отправляете ее клиенту. И повторите это для всех строк в наборе результатов.

Что нужно обратить внимание, это установить тайм-аут для итератора. Клиент должен завершить одну итерацию через некоторое время. Это время должно быть меньше времени, которое MySQL позволит пройти между двумя выборками строк из набора результатов.

Кроме того, требуется тайм-аут, потому что, если данные в запрошенных таблицах изменяются во время запроса, он может заполнять журнал MySQL UNDO, если выбор результата занимает слишком много времени.

Смежные вопросы