1

J'ai un site Web où l'utilisateur peut télécharger une feuille de calcul Excel pour charger des données dans une table. Il peut y avoir quelques lignes de 100k dans la feuille de calcul Excel. Lorsqu'il télécharge le fichier, le site Web doit insérer un nombre égal de lignes dans une table de base de données.Insérer 100k lignes dans la base de données à partir du site Web

Quelle stratégie devrais-je prendre pour cela? Je pensais afficher un "Please wait page" jusqu'à ce que l'opération soit terminée mais je veux qu'il puisse continuer à naviguer sur le site. De plus, puisque la base de données à ce moment-là sera très occupée, est-ce que cela n'empêcherait pas les gens de travailler sur le site Web?

Ma couche d'accès aux données est dans NHibernate.

Merci, Y

Répondre

4

Affichage d'une s'il vous plaît attendre la page serait assez hostile que votre utilisateur pourrait être wating un certain temps et bloquerait threads sur votre serveur web.

Je voudrais télécharger le fichier, le stocker et créer une entrée dans une file d'attente (vous aurez besoin d'une autre table pour cela) pour indiquer qu'il y a un fichier en attente de traitement. Vous pouvez alors avoir un autre processus (qui pourrait même fonctionner sur son propre serveur) qui récupère les tâches de cette table et traite le fichier xls à son propre rythme.

+0

Merci - Puis-je créer un autre thread qui charge les données dans la table? Comme l'utilisateur télécharge le fichier et revient immédiatement sur le site alors qu'un autre thread charge les données dans la base de données. – Yannis

+0

+1 Un des avantages supplémentaires de ceci est qu'il vous aidera à gérer la charge de pointe sur votre base de données – AdaTheDev

+0

@Yannis - J'écrirais en fait un processus séparé. Gardez le téléchargement DB complètement séparé de votre site Web. Vous pourriez le faire sur un autre sujet, mais je ne pense pas qu'il y ait beaucoup à y gagner, il serait plus facile de le faire complètement séparément. –

1

Je voudrais créer une file d'attente de téléchargement qui soumettrait cette demande à. Ensuite, l'utilisateur pourrait simplement vérifier dans la file d'attente de temps en temps. Vous pouvez stocker la progression de l'opération par lots dans la file d'attente pendant le traitement des lignes. De plus, les serveurs de bases de données sont des systèmes robustes, puissants et multitâches. À moins que vous n'ayez observé un problème avec le site Web pendant que les insertions se produisent, ne présumez pas que cela empêchera les gens de travailler sur le site Web. Cependant, en ce qui concerne l'insertion ou les performances de lecture/écriture simultanées, il existe des mécanismes pour y remédier. Vous pouvez utiliser la syntaxe "INSERT LOW PRIORITY" dans MySQL ou demander à votre application de limiter les insertions en dormant une milliseconde entre chaque insertion. En outre, la façon dont vous créez vos instructions d'insertion, que vous utilisiez ou non des paramètres liés, et que vous utilisiez des insertions à valeurs multiples peut affecter les performances des insertions et la façon dont elles affectent les clients dans une large mesure.

0

Lors de la soumission, vous pouvez transmettre l'opération de base de données à un RequestHandler asynchrone et définir une valeur de session lorsqu'elle est terminée. Pendant que le processus asynch est en cours, vous pouvez vérifier la valeur de session à chaque requête et si elle est définie (opération = terminée) afficher un message, par exemple dans un mécanisme de message modal ou autre que vous avez.

Questions connexes