2009-06-02 6 views
0

Ich habe eine ASP.NET-Anwendung, die einige Geschäftsobjekte zwischenspeichert. Wenn ein neues Objekt gespeichert wird, rufe ich remove auf dem Schlüssel auf, um die Objekte zu löschen. Die neue Liste sollte beim nächsten Mal, wenn ein Benutzer die Daten anfordert, lazy geladen werden.ASP.NET Cache - Umstände, in denen Entfernen ("Schlüssel") nicht funktioniert?

Außer gibt es ein Problem mit verschiedenen Ansichten des Cache in verschiedenen Clients.

  • Zwei Benutzer betrachten die Website
  • Ein neues Objekt durch den Benutzer gespeichert 1 und der Cache entfernt wird
  • Benutzer 1 die auf dem neuesten Stand Sicht auf die Daten
  • User 2 sieht auch verwendet die Website, aber nicht aus irgendeinem Grunde nicht die neuen zwischengespeicherten Daten sehen, nachdem Benutzer 1 ein neues Objekt gespeichert hat - sie weiterhin die alte Liste sehen

Dies ist eine verkürzte Version des Codes:

public static JobCollection JobList 
{ 
    get 
    { 
     if (HttpRuntime.Cache["JobList"] == null) 
     { 
       GetAndCacheJobList(); 
     } 
     return (JobCollection)HttpRuntime.Cache["JobList"]; 
    } 
} 

private static void GetAndCacheJobList() 
    { 
     using (DataContext context = new DataContext(ConnectionUtil.ConnectionString)) 
     { 
      var query = from j in context.JobEntities 
         select j; 
      JobCollection c = new JobCollection(); 
      foreach (JobEntity i in query) 
      { 
       Job newJob = new Job(); 
       .... 
       c.Add(newJob); 
      } 
      HttpRuntime.Cache.Insert("JobList", c, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, null); 
     } 
    } 

public static void SaveJob(Job job, IDbConnection connection) 
    { 
     using (DataContext context = new DataContext(connection)) 
     { 

       JobEntity ent = new JobEntity(); 
       ... 
       context.JobEntities.InsertOnSubmit(ent);     
       context.SubmitChanges(); 
       HttpRuntime.Cache.Remove("JobList");          

     } 
    } 

Hat jemand irgendwelche Ideen, warum dies passieren könnte?

Edit: Ich benutze Linq2SQL, um die Objekte zu retreive, obwohl ich den Kontext entsorgen.

Antwort

0

Das liegt daran, dass Sie keine Cache-Operationen synchronisieren. Sie sollten Ihre Liste in den Cache schreiben (möglicherweise sogar die Liste innerhalb der Sperre holen) und sie auch aus dem Cache entfernen. Andernfalls, selbst wenn das Lesen und Schreiben synchronisiert sind, gibt es nichts, was das Speichern der alten Liste nach dem Aufruf von Entfernen verhindern würde. Lassen Sie es mich wissen, wenn Sie ein Codebeispiel benötigen.

+0

Cache ist Thread sicher – fengd

0

Ich würde auch überprüfen, wenn Sie nicht bereits, dass die alten Daten, die sie sehen, nicht irgendwie in ViewState zwischengespeichert worden ist.

1

Ich würde Sie bitten, sicherzustellen, dass Sie nicht mehrere Produktionsserver für den Lastenausgleich Zweck haben. In diesem Fall müssen Sie eine externe Abhängigkeitsarchitektur zum Ungültigmachen/Entfernen der Cache-Elemente verwenden.

0

Sie müssen sicherstellen, dass Benutzer 2 eine neue Anfrage gesendet hat. Vielleicht ist der Inhalt, den er gesehen hat, aus dem Cache des Browsers, nicht aus dem Cache von Ihrem Server