2009-11-22 3 views
24

Je viens de commencer à penser à utiliser le cache de second niveau NHibernate dans l'une de mes applications. J'utiliserais probablement le NHibernate.Caches.SysCache.SysCacheProvider qui repose sur le cache ASP.net.Supprimer des objets du cache de second niveau NHibernate

Activer le cache n'était pas un problème, mais je me demande comment gérer le cache e. g. supprimer par programme certaines entités du cache, etc.

Mon application est une sorte de base de données d'images. L'utilisateur télécharge des images sur un backend et peut le voir dans le frontend en accédant /ImageDb/Show?userId=someUserId

Les données ne changent pas très souvent. Et si cela change, les utilisateurs n'auraient pas d'importance un bouton nommé "effacer mon cache" dans le backend qui supprime les objets mis en cache pour cet utilisateur à partir du cache.

J'ai trouvé une solution en ligne qui peut supprimer tous les objets en cache du cache de second niveau nhibernates. Mais c'est un peu trop brutal pour moi ... Je ne veux pas effacer tout le cache pour des dizaines d'utilisateurs juste parce qu'un utilisateur a essayé d'effacer le cache pour ses propres données.

Donc, ce que je voulais essentiellement faire: supprimer sélectivement les objets db mis en cache de nhibernates cache de second niveau en C#.

Est-ce possible? Je suppose que cela dépend aussi du fournisseur de cache. Si ce n'est pas faisable avec le fournisseur de cache ASP.net, je suis ouvert pour d'autres suggestions intégrées/open source.

+0

Je sais que ce n'est probablement pas pertinent maintenant, mais notez que votre schéma d'URI est incorrect. Il devrait être Utilisateurs/[Id]/ImageDB/Show –

+0

@the_drow - à moins que l'application est appelée ImageDb :) Vous avez toujours raison, il suffit de changer ImageDB en/Images ou quelque chose –

+0

@LukeSchafer: J'ai écrit ImageDb seulement parce que l'OP l'utilise. –

Répondre

40

le sessionFactory fournit les méthodes que vous voulez ... de la 19.3 chapter of the NHibernate reference:

Pour retirer tous les objets du cache de session, appelez ISession.Clear() Pour le cache de second niveau, il existe des méthodes défini sur ISessionFactory pour expulser l'état mis en cache d'une instance , d'une classe entière, d'une instance de collection ou d'un rôle de collection entier.

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

Pauvres chatons ... –

+6

Le nom de rôle ici dans le premier paramètre est l'espace de noms complet + Nom de classe + Propertyname de ce que vous devez expulser. Vous pouvez tout voir dans le cache en appelant sessionFactory.GetAllCollectionMetaData(). Keys. –

Questions connexes