2009-11-10 10 views
0

J'ai un site ASP classique, qui nécessite que certaines tables de base de données soient vidées des données de session sur un planning. Ce système n'a pas accès à des tâches planifiées (il est sur un hébergeur partagé et utilisant le serveur MySQL)Comment planifier des tâches de nettoyage de base de données régulières dans ASP classique?

Je considérais à l'aide global.asa, pour déclencher des événements en tant que tels:

  1. Application_OnStart - supprimer tous les données de session de la base de données
  2. Application_OnEnd - supprimer toutes les données de session
  3. Session_OnStart - créer un utilisateur » la session
  4. Session_OnEnd - supprimer toutes les données de la session qui se rapporte à ce s ession.

Y at-il une raison pour laquelle je ne devrais pas créer de connexions de base de données dans global.asa? Ceux-ci seront créés et détruits ici, pas partagés sur la portée de la session ou de l'application. Je le vois comme un moyen d'exécuter ces tâches d'administration deux fois par utilisateur (au début et à la fin de la session) et de ne pas être renvoyé à nouveau pour un trafic de base de données très faible.

Quelqu'un at-il des idées sur les raisons pour lesquelles cela peut être mauvais? Des raisons de ne pas se connecter à une base de données dans global.asa?

Si quelqu'un pense que l'idée ci-dessus est un mauvais - avez-vous d'autres idées quant à la façon que je peux ces tables régulièrement vides sans un ou plusieurs:

  1. Tâche planifiée
  2. Database tâche planifiée
  3. l'exécution du code de la charge de page pour chaque page (d'où les Session_OnStart crochets)

Ta »

Coconut principal

Répondre

2

Je ferais le nettoyage pour une seule session dans Session_OnEnd et pour TOUTES les sessions dans Application_OnStart. Si votre nettoyage de toutes les sessions est lent, vous pouvez faire une chose laide et mettre ce nettoyage dans un fichier ASP séparé que vous faites une requête http à l'aide de la classe XMLHTTP, n'oubliez pas de ne pas attendre la fin de la requête. ne commencera pas à être servi avant que tout le code Application_OnStart ne soit exécuté.

3

Cela dépend de la durée de vos tâches de nettoyage. Comme aucune requête ne sera traitée pendant l'exécution d'Application_Start, elle peut bloquer pendant un certain temps. De plus, vous n'avez aucune garantie que Application_End (ou Session_End) sera appelée dans tous les cas (lorsque le serveur est éteint, il peut ne pas être déclenché, ou une défaillance catastrophique peut complètement contourner ces événements). La meilleure façon serait, comme vous le suggérez, d'exécuter une tâche planifiée en charge du nettoyage des données de session périmées.

+0

Salut Yann, Bon point re: Application_Start ralentir les choses - Je ne l'aurais pas considéré - bien que pas sûr de ce que les retards potentiels sont - espérons-le court. J'espère que session_end enlèvera la majorité des données de session, en limitant au minimum les retards dans Application_Start (ie ces requêtes devraient être peu nombreuses à moins que le serveur plante) –

3

Vous pouvez écrire une page Web qui vide les tables de session et appeler cette page à partir d'une boîte externe via une tâche planifiée.

+0

C'est ce que nous avons déjà configuré - mais je ne le fais pas comme la dépendance sur une autre boîte pour nettoyer les données de session, et voulait en faire une solution "autonome". –

0

Si votre trafic est constant, vous pouvez effectuer de petites tâches à la fin d'un cycle de demande. Il suffit d'émettre un response.flush puis d'exécuter les requêtes db.Bien sûr, vous devez écrire votre propre planificateur. Une autre option consiste à créer un fichier asp séparé (tasklet) que vous envoyez en utilisant un serveur, async, xmlhttpreq au début de la requête. Cela empêche le code de nettoyage de sortir du cycle de demande des clients et réduit la latence.

En fait, je ne serais pas surpris s'il n'y avait pas déjà un webappr/api intelligent basé sur appengine qui peut ping votre yourte/webhooks legacy dans les délais prévus. Et s'il n'y en a pas, vous pouvez écrire un vous-même, les options sont infinies :)