2009-09-07 6 views
0

Nous avons cette application PHP qui sélectionne une ligne de la base de données, travaille dessus (appelle une API externe qui utilise un service web), puis insère un nouveau registre basé sur le travail effectué. Il y a un affichage AJAX qui informe l'utilisateur du nombre de registres traités.Base de données de diverses connexions vs une

Les données sont principalement du texte, ce sont donc des données plutôt lourdes.

Le processus est effectué par des milliers de registres à la fois. L'utilisateur peut choisir combien de registres commencer à travailler. Les données sont obtenues à partir d'une table, où elles sont marquées comme "fait". Pas de condition "WHERE", sauf la "date WHERE facultative ENTRE date1 et date2".

Nous avons eu un argument sur lequel approche est meilleure:

  • Sélectionnez un registre, le travail sur, et insérer les nouvelles données
  • Sélectionnez tous les registres, le travail avec eux en mémoire et insérez-les dans la base de données après tout le travail a été fait.

Quelle approche considérez-vous comme la plus efficace pour un environnement web avec PHP et PostgreSQL? Pourquoi?

Répondre

1

Cela dépend vraiment combien vous souciez de vos données (sérieusement):

Est-ce que la fiabilité question dans ce cas? Si le processus meurt, pouvez-vous simplement tout retraiter? Ou vous ne pouvez pas?

Généralement, lorsque vous appelez un service Web distant, vous ne souhaitez pas l'appeler deux fois pour le même élément de données. Peut-être y a-t-il des effets secondaires (comme les frais de carte de crédit), ou peut-être pas une API gratuite ...

De toute façon, si vous ne vous souciez pas du traitement potentiel des doublons, adoptez l'approche par lots. C'est simple, c'est simple et rapide.

Mais si vous souciez de traitement en double, faites ceci:

  1. SELECT 1 enregistrement de la table FOR UPDATE (ie.verrouiller dans une transaction)
  2. UPDATE record avec un statut de "traitement"
  3. Commit cette transaction

Et puis

  1. traiter l'enregistrement
  2. mettre à jour le contenu de l'enregistrement, ET
  3. Définissez l'état sur "Terminé" ou "Erreur" en cas d'erreur.

Vous pouvez exécuter ce code simultanément sans craindre qu'il ne s'exécute sur lui-même. Vous serez en mesure d'avoir confiance que le même enregistrement ne sera pas traité deux fois.

Vous serez également en mesure de voir les enregistrements qui "ne l'ont pas fait", parce que leur statut sera "Traitement", et toutes les erreurs.

+0

Je pense que les avantages de l'approche batch sont assez convaincants. Je l'ai déjà implémenté de cette façon. C'est une application web, donc je pense que le chargement de toutes ces données à la fois pourrait être assez mauvais sur la mémoire du serveur, n'est-ce pas? –

0

Si les données sont lourdes et que la charge est importante, étant donné que l'application n'est pas dépendante du temps réel, la meilleure approche est d'obtenir les données nécessaires et de les retravailler.

L'efficacité, quelle que soit la langue, est que si vous ouvrez des éléments individuels et travaillez dessus individuellement, vous fermez probablement la connexion à la base de données. Cela signifie que si vous avez des milliers d'éléments, vous allez ouvrir et fermer 1000 de connexions. Les frais généraux sur cette distance l'emportent sur les frais généraux de retourner tous les éléments et de travailler sur eux.

+0

Il ne semblait pas qu'il commençait un nouveau script PHP pour chaque élément. Même s'il l'était, pconnect compenserait cela. http://us.php.net/manual/en/function.pg-pconnect.php – gahooa

Questions connexes