9
votes

MemoryCache vide juste après avoir ajouté un objet

Je suis confronté à un problème étrange avec ASP.NET ModyCaching dans une application mvc 3 ASP.NET.

Chaque fois qu'une action est exécutée, je vérifie si son logininfo est réellement stocké dans le cachemaque (code a été simplifié. , mais le noyau est comme suit): xxx

Le getlogininfo est le suivant: xxx

Le SetLoginInfo est: xxx

Le code est assez simple, mais parfois (totalement aléatoirement), juste après avoir ajouté le logininfo au matièresCache, ce résulte vide, l'objet juste ajouté n'est pas présent, donc j'ai eu l'exception .

Je teste cela à la fois sur Cassini et IIS 7, il semble ne pas lié à la réutilisabilité de l'Applool (activé dans IIS 7), j'ai testé avec plusieurs politiques de mise en cache, mais je ne peux pas le faire fonctionner

Qu'est-ce que je manque / défaillant?

PS: Pardonne-moi pour mon mauvais anglais


8 commentaires

Avez-vous une méthode appelée getlogininfo et getlogindata ou est-ce une faute de frappe?


Avez-vous confirmé logindata.userlogin (utilisateur.entity.name); ne renvoie pas null?


@DannyTuppeny: Nom différent pour Setter / Getter est une faute de frappe dans ma pâte CUT'N. La méthode userLogin ne renvoie pas NULL, elle se lit à partir d'un profil d'utilisateurs de tableaux de DB, BTW, CROIST vérifié avec l'inspection de toutes les variables. Je soupçonne que mon entrée dans le cache est disposée par quelque chose juste après que je l'ajoute. Je vais essayer d'ajouter un removecallback pour voir si c'est le cas.


@Bigmike, ressemble à memorycache.default est périmé. Êtes-vous sûr de ne pas connaître une condition de course entre deux threads? Par exemple, get () pourrait se produire sur le thread a entre Supprimer () et ajouter () sur le fil B.


@ Frédéricamidi n'a pas pensé à ce scénario, peut être une bonne idée. En réalité, l'application s'exécute dans ASP.NET App Pool (et s'ils n'avaient pas changé cela, devrait être un bassin de fil du même processus IIS). Je vais enquêter sur ce avenir dès que je serai de retour au travail. Merci.


De plus, si vous êtes faible sur la mémoire ou quelque chose comme ça, les choses pourraient être supprimées du cache immédiatement?


@DannyTuppeny: L'objet entier est de quelques centaines d'octets et lors de tests, je suis en cours d'exécution avec 10/15 faux utilisateurs. La machine cible est un serveur PreProd avec des tonnes de RAM. Peut-être qu'il y a quelques paramètres dans .net pour définir l'espace initial de cache?


@Bigmike malheureusement, je ne sais pas vraiment beaucoup de la cache. Je viens de voir des problèmes sur l'un de nos systèmes où Thigns était immédiatement expulsé de cache en bass ram :(


3 Réponses :


2
votes

Le MemoryCache a une taille limitée. Pour le Par défaut instance, est ' t valeur heuristique (selon MSDN ) .

Avez-vous essayé de définir priorité propriété sur cacheItempolicy instance notreMovable ?

Vous pouvez avoir une condition de course car la séquence contenant-supprimer-ajouter dans setlogininfo n'est pas atomique - essayez d'utiliser Set Méthode à la place.

BTW. Vous travaillez sur la demande Web, alors pourquoi ne pas utiliser Système. Web.caching.cache à la place?


1 commentaires

Salut Augi. Long time a passé depuis que j'ai demandé cela, le code n'est pas à jour, je vais le réparer dès que possible. En fait, nous avons changé notre stratégie de mise en cache à des tables de base de données simples. Ifrc j'ai essayé aussi à l'aide de la méthode définie et du système.web.caching.cache sans succès. Cependant, dans les prochaines semaines, je dois travailler sur une nouvelle application MVC et je vais essayer de tenter cela. . (Je prévois beaucoup de mise en cache mais sur un serveur de cache dédié, ce sera amusant). Cependant +1 pour donner de bonnes notes. Merci.



3
votes

Regarder le code pour MemoryCache en utilisant une fonction privée décrive la fonction privée suivante

private void OnUnhandledException(object sender, UnhandledExceptionEventArgs eventArgs)
{
  if (!eventArgs.IsTerminating)
    return;
  this.Dispose();
}


1 commentaires

Intéressant. Nous avons supprimé le cache pour l'instant, dès que nous avons du budget à dépenser sur cette application, je vérifierai cela.



1
votes

Je pense que vous rencontrez un problème que Scott Hanselman est identifié comme un bogue .NET 4. S'il vous plaît voir ici: MemoryCache vide: renvoie NULL après avoir été défini


1 commentaires

Vous avez probablement raison, cette question a été ouverte depuis si longtemps que je l'ai presque oubliée. Sur notre application, nous avons simplement changé l'architecture pour éviter l'utilisation de cache.