Réduire le nombre d'appels de base de données sur un site Web MVC

asp.net-mvc-4 c# dapper

Question

J'ai un site Web C # MVC 4 complexe qui se connecte à plusieurs bases de données. Chaque demande passe par les étapes suivantes

  1. Vérifiez si l'utilisateur est connecté et obtenez le nom d'utilisateur du cookie d'authentification.
  2. Interrogez une base de données de recherche pour savoir où se trouve la base de données du client et récupérez sa chaîne de connexion (nous gérons une base de données différente pour chaque client).
  3. Connectez-vous à la base de données client et exécutez une requête pour obtenir les détails de l'utilisateur (ID, numéro de téléphone, préférences, etc.).
  4. Effectuez select / update / delete ou insert en fonction de la requête.

En plus des étapes ci-dessus, nous avons également plusieurs filtres d'action qui interrogent la base de données et vérifient les rôles, etc. Ces filtres d'action doivent exécuter les étapes 1, 2, 3 et 4 pour récupérer les informations utilisateur. Je constate maintenant que l'application est lente en raison du nombre de requêtes à effectuer. Je peux considérablement accélérer en mettant en cache la chaîne de connexion et les détails de l'utilisateur dans la session.

Nous allons bientôt transférer le site sur une batterie de serveurs et je ne souhaite pas compter sur la session pour la mise en cache. Existe-t-il d'autres choix de conception évidents ou dois-je continuer à utiliser la mise en cache sous la forme de memcached ou d'une solution compatible avec une batterie de serveurs?

Edit: J'aurais dû mentionner que la base de données et le site Web se trouvent sur des serveurs différents et que les appels à la base de données doivent parfois être passés sur le WAN en fonction de l'emplacement du client. J'ai déjà mesuré les performances et je sais que les appels à la base de données sont la cause de mauvaises performances.

Réponse acceptée

Vous pouvez essayer d'utiliser HttpCookie et AuthenticationCookie ici pour conserver l'état des données redondantes auxquelles vous aurez accès sur vos vues et contrôleurs. Un exemple simple que je dirais serait de maintenir l'état de l'ID utilisateur et du nom d'utilisateur de l'utilisateur qui s'est connecté. C'est ce que vous pouvez utiliser comme référence:

private void SetCookie(string userName, long userId)
{
   string IdUser = Common.Encrypt(userId.ToString());
   FormsAuthentication.SetAuthCookie(userName, false);
   HttpCookie uCookie = new HttpCookie("UserId", IdUser);
   Response.Cookies.Add(uCookie);
}

Ceci est juste un exemple de code pour montrer comment les cookies peuvent être générés. Une fois que vous avez défini les informations dans vos cookies, vous ne devez pas frapper la base de données chaque fois que vous avez besoin de cet identifiant ou de ce nom ou numéro de téléphone ou de toute autre chose. Il vous suffit de récupérer ces informations à partir des cookies que vous avez créés.

J'espère que cela t'aides.


Réponse populaire

Vous pouvez générer un cookie d'authentification après la première étape et enregistrer les données dans une session ou un cookie. Par la suite, vous pouvez utiliser les données d'un cookie / session enregistré précédemment et ignorer l'étape 1.

Vous pouvez essayer l'indexation de cluster pour récupérer des données plus rapidement



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi