Удаление объектов из кэша второго уровня NHibernate
Я только начал думать об использовании кэша второго уровня NHibernate в одном из моих приложений. Я бы, наверное, использовал NHibernate.Caches.SysCache.SysCacheProvider
который опирается на кэш ASP.net.
Включение кеша не было проблемой, но мне интересно, как управлять кешем, например, программным способом удалять определенные объекты из кеша и т. Д.
Мое приложение - это какая-то база данных изображений. Пользователь загружает изображения через бэкэнд и может просматривать его во внешнем интерфейсе, открывая /ImageDb/Show?userId=someUserId
Данные не меняются очень часто. И если это изменится, пользователям не будет важна кнопка с именем "очистить мой кеш" в бэкэнде, которая удаляет кэшированные объекты для этого пользователя из кеша.
Я нашел решение онлайн, которое может удалить все кэшированные объекты из кэша второго уровня nhibernates. Но это слишком грубая сила для меня... Я не хочу очищать весь кеш для десятков пользователей только потому, что один пользователь пытался очистить кеш для своих собственных данных.
Итак, что я в основном хотел сделать: выборочно удалять кэшированные объекты БД из кэша второго уровня nhibernates в C#.
Это возможно? Я думаю, это также зависит от поставщика кэша. Если это невозможно с провайдером кэша ASP.net, я открыт для других предложений встроенного / открытого источника.
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