2009-09-07 5 views
0

У нас есть это приложение PHP, которое выбирает строку из базы данных, работает над ней (вызывает внешний API, который использует веб-сервис), а затем вставляет новый регистр на основе выполненной работы. Существует дисплей AJAX, который информирует пользователя о том, сколько регистров было обработано.База данных различных подключений по сравнению с одним

Данные в основном текстовые, поэтому это довольно тяжелые данные.

Процесс производится тысячами регистров времени. Пользователь может выбрать, сколько регистров начать работу. Данные получены из одной таблицы, где они отмечены как «сделанные». Нет условия «WHERE», кроме опциональной «WHERE date BETWEEN date1 AND date2».

Мы поссорились, над которым подход лучше:

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

Какой подход вы считаете наиболее эффективным в отношении веб-среды с PHP и PostgreSQL? Зачем?

ответ

1

Это действительно зависит от того, насколько вы заботитесь о ваших данных (серьезно):

важна надежность вещества в этом случае? Если процесс умирает, можете ли вы просто переработать все? Или ты не можешь?

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

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

Но если вы заботитесь о дубликате обработки, то сделать это:

  1. ВЫБРАТЬ 1 запись из таблицы FOR UPDATE (то есть.зафиксировать его в сделке)
  2. UPDATE, что запись со статусом "Обработка"
  3. Зафиксируйте эту транзакцию

, а затем

  1. процесс записи
  2. Обновление содержимого записи, И
  3. Установите статус «Завершить» или «Ошибка» в случае ошибок.

Вы можете запускать этот код одновременно, не опасаясь, что он работает сам по себе. Вы сможете быть уверены, что одна и та же запись не будет обрабатываться дважды.

Вы также сможете увидеть любые записи, которые «не сделали этого», потому что их статус будет «Обработка» и любые ошибки.

+0

Я думаю, что преимущества пакетного подхода достаточно убедительны. Я уже реализовал его таким образом. Это веб-приложение, поэтому я думаю, что загрузка всех этих данных сразу может быть довольно плохой в памяти сервера? –

0

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

Эффективность, независимо от языка, заключается в том, что если вы открываете отдельные элементы и работаете с ними по отдельности, возможно, вы закрываете соединение с базой данных. Это означает, что если у вас есть 1000 предметов, вы откроете и закроете 1000 соединений. Накладные расходы на это намного превышают накладные расходы по возврату всех предметов и работе над ними.

+0

Не похоже, что он начинал новый скрипт PHP для каждого элемента. Даже если бы он был, то pconnect компенсировал бы это. http://us.php.net/manual/en/function.pg-pconnect.php – gahooa

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