2017-10-20 32 views
0

J'ai un problème avec EF6 sur un développement Web. Dans la page d'index j'ai besoin d'exécuter une requête pour afficher quelques informations, le problème est que la première requête crée le modèle sur la mémoire et prend plus de 10 secondes pour le faire (n'est pas dans un excellent hébergement). Comment les gens réagissent-ils? Obtenir les premières données avec une requête directe? lire un fichier txt?Entity Framework 6 générant des performances de modèle

+2

Vous pouvez pré-générer des vues EF: https://msdn.microsoft.com/en-us/data/dn469601.aspx – Riv

+0

Veuillez indiquer le code de votre requête. –

+0

@Riv Je vais essayer de pré-générer des vues .. J'ai vu cette option avant mais c'est un modèle simple avec 10 entités et peu de relations, cela devrait fonctionner par défaut ... – Maxi

Répondre

0

Par défaut dans EF, il dispose d'un mécanisme de suivi des modifications d'instantanés.

Il fonctionne en sauvegardant les états d'entité chaque fois qu'il est chargé à partir de la base de données. Lorsque, par exemple, la méthode SaveChanges est appelée, Entity Framework vérifie toutes les entités dans le contexte actuel et les compare avec l'état sauvegardé.

Cela peut être une touche parfois lent ... dans le mandrin de cteur de contexte dans ce:

this.Configuration.AutoDetectChangesEnabled = false; 

Cela désactive le suivi de l'entité qui devrait enlever un peu de frais généraux ici. Cependant, s'il s'agit de données assez statiques, vous pouvez peut-être utiliser un cache pour conserver les données lorsque l'application démarre, il vous suffit de les retirer de la mémoire et de les actualiser toutes les x heures/minutes.

aussi, en aparté, passer à AZURE si vous le pouvez, il ne coûtera pas beaucoup plus que je pense et sera beaucoup plus facile de travailler avec des déploiements etc.

0

Il y a deux choses que je faire: 1) Profil de votre requête et voir si cela prend vraiment 10 secondes. Consultez le préfixe LINQPad, Glimpse ou Stackify pour voir la requête SQL générée à partir de EF. Une requête inefficace pourrait être votre problème. L'utilisation d'une vue dans votre base de données ou la définition d'index peut résoudre le problème.

2) Si vous souhaitez exécuter cette requête une seule fois, puis utiliser une copie en mémoire pour les demandes suivantes, utilisez MemoryCache. Il y aura toujours un hit de performance pour la première requête, mais toutes les requêtes suivantes seront incroyablement rapides tant que le cache est configuré pour durer. Il y a un problème de mémoire lors de l'utilisation car vous gardez les résultats dans la mémoire à long terme. Si chaque visiteur a une demande dynamique sur la page d'index, vous utiliserez beaucoup de mémoire. Si la demande est la même pour tous les utilisateurs, ce sera une excellente option.