cs_rastali
Messages postés13Date d'inscriptionjeudi 6 avril 2006StatutMembreDernière intervention21 mars 2008
-
10 janv. 2008 à 17:25
cs_rastali
Messages postés13Date d'inscriptionjeudi 6 avril 2006StatutMembreDernière intervention21 mars 2008
-
11 janv. 2008 à 17:48
Bonjour à tous,
J'ai un gros souci sur l'application que je développe (VS 2005, ASP.NET 2.0 C#).
J'effectue le traitement de données suivant:
- lecture d'un fichier xml
- affichage des informations à l'écran
- saisie d'informations complémentaires par l'utilisateur
- insertion des données en base.
C'est lors de l'étape d'insertion des données en base qu'il y a un problème. Je dois insérer parfois jusqu'à 30000 enregistrements. Le traitement dure entre 2h et 2h30 suivant la quantité d'info contenue dans les fichiers xml.
Au début je faisais un simple appel de ma procédure stockée d'insertion dans une boucle, la barre de progression de IE progressé pour finalement arriver sur la page d'erreur d'IE (impossible d'afficher la page) et le traitement n'etait pas terminé.
Après quelque recherche, j'ai ajouté un UpdatePanel et un UpdateProgress. Au bout d'un moment (environ 30 minutes) le message affiché dans le ProgressTemplate de l'UpdateProgress disparaissait, puis un pop-up d'erreur s'affichait avec le code erreur suivant : "Sys.WebForms.PageRequestManagerServerErrorException: An unknown error occurred while processing the request on the server. The status code returned from the server was : 500" et j'ai déjà eu le meme message d'erreur avec le code erreur 12152.
Après un click sur le bouton OK de la pop up, quand le code erreur est 500, la fonction qui appelle la proc stock me renvoie : Le thread a été abandonné. et le traitement ne se termine pas.
Après un click sur le bouton OK de la pop up, quand le code erreur est 12152, le traitement continue de façon transparente jusqu'à la fin, et je peux naviguer sur mon application, mais cette pop up est tout de meme derangeante, sans compter que je préférerai que le message de l'Update Progress reste affiché.
Dernière solution testée, j'ai essayé d'effectuer ces multiples insertions a l'intérieur d'un thread. Donc la j'ai directement la main sur l'appli, je peux donc changer de page, mais du coup je ne peux pas savoir quand le thread est fini. Mais le gros problème, c'est que ca fini par planter avec l'erreur : le thread a été abandonné, et donc l'insertion des données n'est pas complète.
Est-ce que quelqu'un à une solution à mon problème ?
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 10 janv. 2008 à 23:06
Bonsoir,
Entre 2h et 2h30 ??? ASP.net n'est pas du tout prévu pour ça ! Si tu veux faire ce genre de chose, je te conseille grandement de faire cette opération à un service windows ou autre appli.
1. L'utilisateur upload son fichier
2. Le serveur enregistre le fichier en base ou ailleurs
3. Tu rediriges vers une page avec un UpdatePanel + un timer, tu affiches les informations d'avancement & co que tu récuperes dans la base ou ailleurs
4. Le service windows traite le fichier et stocke les informations d'avancement dans la base ou ailleurs.
ASP.net est concu pour faire des traitement le plus court possible. Monopoliser un thread du pool (20 au total) est très couteux, pour peu que 20 personnes fassent le traitement en meme temps tu bloques le serveur (en fait 17 ou 18 car 2 ou 3 threads sont reservés à localhost pour les opérations d'urgence)
cs_rastali
Messages postés13Date d'inscriptionjeudi 6 avril 2006StatutMembreDernière intervention21 mars 2008 11 janv. 2008 à 09:55
Bonjour,
merci de ta réponse.
Alors tout d'abord il est prevu un seul utilisateur unique de l'application. Cette mise à jour de la base par fichiers xml est prévu une fois par trimestre.
L'un de mes soucis principaux c'est que l'application est censé etre utilisée des la semaine prochaine :s Je n'avais fait des tests qu'avec peu de données, et c'est en faisant des tests avec un jeu de données conséquents que ca plante.
Je ne comprends pas bien ton explication (je n'y connais rien en service windows), en fait le probleme principal vient du fait que l'utilisateur complete et modifie les données, puis choisi de les insérer en base ou pas. De ce fait, je ne vois pas du tout comment gérer cela avec un service windows (les infos des fichiers doivent etre lues directement par le service windows, c'est ca? je ne vois pas comment le service win peut récupérer les infos des fichiers et celles saisies par l'utilisateur).
En fait je pense que je peux m'en sortir mais j'aurai besoin d'un peu d'aide pour le service windows, je m'explique: dans les données des fichiers à insérer en base, les données qui prennent beaucoup de temps ne sont pas modifiées par l'utilisateur. Par exemple, si je met en commentaite cette partie la du code, le traitement se fait en 3 minutes à peine. Ainsi, je pourrai fonctionner de la sorte :
-données non modifiées par l'utilisateur : service windows
-données modifiées par l'utilisateur : asp.net
le fichier est stocké sur le serveur de l'appli, il faut donc que je crée mon service windows, mais est-ce que l'on peut déclencher le service windows, cad l'application asp.net peut-elle appelée une fonction du service windows pour la déclencher ?
jesusonline
Messages postés6814Date d'inscriptiondimanche 15 décembre 2002StatutMembreDernière intervention13 octobre 201029 11 janv. 2008 à 11:03
Service Windows ou application Console, pour l'instant là n'est pas le soucis.
Quand l'utilisateur envoie le fichier, tu l'enregistre dans la base de données.
Ton service windows va checker toutes les x minutes dans la base si y'a qqchose à faire et si oui il le fait.
ta page web va checker toutes les x secondes l'état de l'opération que le service windows stock dans la base.
Mais une application web pour un seul utilisateur ... je sui quasi sur qu'une application win était bien plus adapté.
cs_rastali
Messages postés13Date d'inscriptionjeudi 6 avril 2006StatutMembreDernière intervention21 mars 2008 11 janv. 2008 à 11:19
Ok je vais tenter ca.
Sinon, pour une solution temporaire, dans le cas ou j'utilise l'update panel, n'est-il pas possible d'intercepter la pop-up que m'envoie IE, vue que le traitement continue derriere, je voudrais juste pouvoir intercepter la pop up afin de ne pas l'afficher... bon on ne verrait pas l'avancement du traitement mais ca pourrait etre une solution temporaire viable?
POur l'appli win, l'utilisateur veut pouvoir accéder a l'appli de n'importe ou et n'importe quelle machine, et je ne pouvais pas discuter de ce point...
cs_rastali
Messages postés13Date d'inscriptionjeudi 6 avril 2006StatutMembreDernière intervention21 mars 2008 11 janv. 2008 à 17:20
Bon bah j'avais legerement fait n'importe quoi, en revoyant mon code avec mon chef et surtout mes procs stocks, je me suis rendu compte que je bouclais deux fois et qu'en plus mes procs etaient vraiment pas optimisées. Donc apres reecriture correct du code, optimisation des procs et creation des index pertinents, j'en arrive a entre 5 et 7 minutes de traitement suivant les autres applis qui tournent sur le serveur, et je n'ai aucun plantage en utilsant l'update progress (oui oui je sais la j'ai l'air d'un c*n ^^). Me disais aussi, meme si j'ai 30000 insertions, 2h ca faisait vraiment vraiment long. En plus la on est en serveur de test (serveur oracle + serveur IIS) qui est nettement moins puissant que les serveurs de prod (oracle separé de iis).
Donc ma derniere question, penses-tu qu'il est toujours necessaire de gerer cela avec une appli console?
cs_rastali
Messages postés13Date d'inscriptionjeudi 6 avril 2006StatutMembreDernière intervention21 mars 2008 11 janv. 2008 à 17:48
Ok merci, je vais faire des tests en prod la semaine prochaine et suivant les ressources prises par l'insertion des données je passerai par une appli console.