2009-11-22 11 views
24

Ich habe gerade angefangen, über den Second-Level-Cache von NHibernate in einer meiner Apps nachzudenken. Ich würde wahrscheinlich die NHibernate.Caches.SysCache.SysCacheProvider verwenden, die auf ASP.net-Cache beruht.Entfernen von Objekten aus dem NHibernate-Cache der zweiten Ebene

Aktivieren des Cache war kein Problem, aber ich frage mich, wie man den Cache e verwalten. G. programmgesteuert das Entfernen bestimmter Objekte aus dem Cache usw.

Meine Anwendung ist eine Art Bilddatenbank. Der Benutzer lädt Bilder über ein Backend hoch und kann sie im Frontend anzeigen, indem er auf /ImageDb/Show?userId=someUserId

zugreift. Die Daten ändern sich nicht sehr oft. Und wenn es sich ändert, würden die Benutzer eine Schaltfläche mit dem Namen "Cache löschen" im Back-End, die die zwischengespeicherten Objekte für diesen Benutzer aus dem Cache entfernt.

Ich habe eine Online-Lösung gefunden, die alle zwischengespeicherten Objekte aus Nhibernates Second Level Cache entfernen kann. Aber das ist ein bisschen zu brutal für mich ... Ich möchte nicht den ganzen Cache für Dutzende von Benutzern löschen, nur weil ein Benutzer versucht hat, den Cache für seine eigenen Daten zu löschen.

Also was ich eigentlich tun wollte: selektiv zwischengespeicherte DB-Objekte aus Nhibernates Second-Level-Cache in C# entfernen.

Ist das möglich? Ich denke, es hängt auch vom Cache-Provider ab. Wenn dies mit dem ASP.net-Cache-Provider nicht möglich ist, bin ich offen für andere integrierte/Open-Source-Vorschläge.

+0

Ich weiß, dass es jetzt wahrscheinlich nicht relevant ist, aber beachten Sie, dass Ihr URI-Schema nicht korrekt ist. Es sollte Benutzer sein/[Id]/ImageDB/Show –

+0

@the_drow - es sei denn die App heißt ImageDb :) Du hast immer noch recht, musst nur ImageDB in/Images oder etwas ändern –

+0

@LukeSchafer: Ich habe ImageDb nur deshalb geschrieben das OP benutzt es. –

Antwort

40

die session die Methoden liefern Sie ... vom 19.3 chapter of the NHibernate reference wollen:

Um vollständig alle Objekte aus der Sitzung Cache entfernt, rufen ISession.Clear() Für die Second-Level-Cache gibt es Methoden Definiert in ISessionFactory, um den zwischengespeicherten Status einer Instanz, der gesamten Klasse, der Sammlungsinstanz oder der gesamten Sammlungsrolle zu entfernen.

sessionFactory.Evict(typeof(Cat), catId); //evict a particular Cat 
sessionFactory.Evict(typeof(Cat)); //evict all Cats 
sessionFactory.EvictCollection("Eg.Cat.Kittens", catId); //evict a particular collection of kittens 
sessionFactory.EvictCollection("Eg.Cat.Kittens"); //evict all kitten collections 
+68

Schlechte Kätzchen ... –

+6

Der Name der Rolle hier im ersten Parameter ist der vollständige Namespace + Classname + Propertyname von dem, was Sie brauchen vertreiben Sie können alles im Cache sehen, indem Sie sessionFactory.GetAllCollectionMetaData() aufrufen. Keys. –

Verwandte Themen