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