Массовое извлечение данных из MySQL для Corba Iterator

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

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

1 ответ

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

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

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

Другие вопросы по тегам