Удаление объектов из кеша второго уровня NHibernate

Я только начал думать об использовании кеша второго уровня NHibernate в одном из моих приложений. Я бы, вероятно, использовал NHibernate.Caches.SysCache.SysCacheProvider, который полагается на кеш ASP.net.

Включение кеша не было проблемой, но мне интересно, как управлять кешем e. г. программное удаление определенных сущностей из кеша и т. д.

Мое приложение - это своего рода база данных изображений. Пользователь загружает изображения через серверную часть и может просматривать их в веб-интерфейсе, открыв /ImageDb/Show?userId=someUserId

Данные меняются не очень часто. И если он изменится, пользователи не будут иметь значения, кнопка с названием «очистить мой кеш» в бэкэнде, которая удаляет кешированные объекты для этого пользователя из кеша.

Я нашел в Интернете решение, которое может удалить все кэшированные объекты из кеша второго уровня nhibernates. Но для меня это слишком грубая сила ... Я не хочу очищать весь кеш для десятков пользователей только потому, что один пользователь пытался очистить кеш для своих собственных данных.

Итак, что я в основном хотел сделать: выборочно удалить кешированные объекты db из кеша второго уровня nhibernates в C #.

Это возможно? Я думаю, это также зависит от поставщика кеша. Если это невозможно с поставщиком кеш-памяти ASP.net, я открыт для других встроенных предложений / предложений с открытым исходным кодом.


person Max    schedule 22.11.2009    source источник
comment
Я знаю, что сейчас это, вероятно, не актуально, но учтите, что ваша схема URI неверна. Это должно быть Users / [Id] / ImageDB / Show.   -  person the_drow    schedule 07.11.2010
comment
@the_drow - если приложение не называется ImageDb :) Вы все еще в основном правы, просто нужно изменить ImageDB на / Images или что-то в этом роде   -  person Luke Schafer    schedule 18.03.2011
comment
@LukeSchafer: Я написал ImageDb только потому, что OP его использует.   -  person the_drow    schedule 22.03.2011
comment
@the_drow - да, конечно, просто указывал, что это может быть виртуальный каталог, и все :)   -  person Luke Schafer    schedule 23.03.2011


Ответы (1)


sessionFactory предоставляет нужные вам методы ... из главы 19.3 NHibernate ссылка:

Чтобы полностью исключить все объекты из кеша сеанса, вызовите ISession.Clear (). Для кеша второго уровня в ISessionFactory определены методы для удаления кэшированного состояния экземпляра, всего класса, экземпляра коллекции или всей роли коллекции.

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
person Jaguar    schedule 30.11.2009
comment
Имя роли здесь в первом параметре - это полное пространство имен + имя класса + имя свойства того, что вам нужно выселить. Вы можете увидеть все в кеше, вызвав sessionFactory.GetAllCollectionMetaData (). Keys. - person Emil Lerch; 18.06.2011