2010-03-07 4 views
0

j'ai un projet ASP.NET qui est un front-end à une base de données. En plus des grandes tables, la base de données contient quelques petites tables pour aider à normaliser les plus grandes tables avec des valeurs communes. J'ai un projet VB.NET qui charge les tables plus petites en mémoire, en utilisant des variables membres "partagées" (c'est-à-dire, "statique" dans C#), et les utilise. J'ai un appel pour charger les tables dans Global.asax - Application_Start. Cela fonctionne pendant un moment. En d'autres termes, Application_Start s'exécute lors de la première exécution de mon projet, charge les valeurs mises en cache et les conserve correctement en mémoire pendant un certain temps.tables Keeping mises en cache sur le serveur dans le projet ASP.NET

Ce que je vois (lors de l'exécution de mon projet via Visual Studio 2008 Debugger, hébergé localement) est:

A) Le code Application_Start courra plus d'une fois. Pas d'affilée, mais après que l'utilisateur a navigué vers d'autres pages, je verrai (mon point d'arrêt) un autre appel pour initialiser le cache, venant du formulaire Application_Start. Est-ce prévu?

B) La variable « partagée » qui a été définie sur True lorsque le cache a été initialisé est maintenant Faux à nouveau (ce qui ne devrait se produire lorsque la classe est d'abord chargée). De même, toutes les données qui ont été endommagées ne sont plus présentes. Autrement dit, il semble que VB décharge tous les membres partagés. Est-ce prévu?

Si ce sont les comportements attendus, est-il un moyen de faire ce que je veux? Le code est dans un module qui est également utilisé par d'autres projets (nonASP.NET), et semble fonctionner correctement pour eux. Je préfère ne pas avoir à dupliquer cette fonctionnalité pour quelque chose de spécifique à ASP.NET, mais j'aimerais savoir quelles sont mes options. Merci pour tout conseil.

+2

Avez-vous regardé dans le EventLog sur le serveur? Sur la surface, il semble que le pool d'applications est en train de recycler. Cela peut être dû à des problèmes de serveur ou à un mauvais code ... Il devrait y avoir des événements eventlog dans ce cas. – David

+0

Merci pour le conseil. Quand je l'exécute sur ma machine Dev en utilisant VS 2008 (juste en appuyant sur F5), où ce journal existerait-il? Est-il écrit dans la fenêtre de sortie? Ou Windows EventViewer? Ou les deux? –

Répondre

0

Voici un article que vous trouverez peut-être utile au sujet Caching Data at Application Startup. Il semblerait que vous fassiez tout ce qu'il faut, mais Application_Start ne devrait être appelée qu'une seule fois, à moins qu'un changement externe ne provoque le redémarrage du pool d'applications, mais dans ce cas je pense que vous serez détaché du débogueur (en supposant que vous êtes connecté à l'application processus de pool pour votre application asp.net).

+0

Le recyclage du pool d'applications tient également compte de la perte de vos données mises en cache. En plus de vérifier l'afficheur d'événements (comme suggéré par M. Stratton), vous pouvez créer un gestionnaire d'événements au niveau de l'application pour voir si des exceptions non interceptées provoquent le plantage du pool d'applications. Voici un lien utile http://msdn.microsoft.com/en-us/library/fwzzh56s%28VS.80%29.aspx –

+0

Pourquoi mettre en cache les données au démarrage de l'application? Pourquoi ne pas le mettre en cache lors de son premier accès? c'est-à-dire vérifier si les données dont j'ai besoin sont dans le cache, si elles sont dans le cache, renvoyer les données, si elles ne sont pas dans le cache, obtenir des données, les ajouter au cache, retourner les données. – FiveTools

+0

Dans beaucoup de cas, vous pouvez paresser charger les données en cache, mais cela ne change pas le fait que Application_Start ne doit pas être appelé plus d'une fois. –

Questions connexes