2009-11-22 8 views
24

방금 ​​내 애플 리케이션 중 하나에서 NHibernate 2 차 레벨 캐시를 사용하는 것에 대해 생각하기 시작했습니다. 아마도 ASP.net 캐시를 사용하는 NHibernate.Caches.SysCache.SysCacheProvider을 사용할 것입니다.NHibernate 2 차 레벨 캐시에서 객체 제거

캐시를 활성화해도 문제가 없지만 캐시를 관리하는 방법에 대해 궁금합니다. 지. 프로그래밍 방식으로 캐시에서 특정 엔티티를 제거합니다.

내 응용 프로그램은 일종의 이미지 데이터베이스입니다. 사용자가 백엔드를 통해 이미지를 업로드하고 액세스하여 프론트 엔드에서 볼 수 있습니다.

데이터가 자주 변경되지 않습니다. 그리고 변경된 경우 사용자는 캐시 된 객체를 캐시에서 제거하는 백엔드에서 "clear my cache"라는 버튼을 사용하지 않아도됩니다. 캐시에서.

온라인으로 해답을 찾을 수있는 해결책을 찾았습니다. 모두 캐시 된 개체가 nhibernates second level cache에서 제거되었습니다. 그러나 저를위한 조금 무식한 힘 thats ... 나는 1 명의 사용자가 그 자신의 자료를위한 시렁을 맑게하는 것을 시도했기 때문에 다스 사용자를위한 전체 시렁을 맑게하고 싶지 않다.

그래서 기본적으로 C :의 nhibernates 2 차 캐시에서 캐시 된 db 개체를 선택적으로 제거하려고합니다.

이것이 가능합니까? 캐시 공급 업체에 따라 달라집니다. ASP.net 캐시 공급자와 함께이 작업을 수행 할 수 없다면 다른 내장/공개 소스 제안을 위해 열려 있습니다.

+0

아마 지금은 관련이 없지만 URI 체계가 올바르지 않습니다. 그것은 응용 프로그램이 ImageDb라고하지 않는 한 Users/[Id]/ImageDB/Show –

+0

@the_drow 여야합니다. 아직 대부분 괜찮습니다. ImageDB를/Images 또는 다른 것으로 변경해야합니다. –

+0

@ LukeSchafer : 저는 ImageDb를 썼습니다 OP는 그것을 사용합니다. –

답변

40

SessionFactory에가 당신이 원하는 방법 ... 19.3 chapter of the NHibernate reference에서 제공

완전히 ISession.Clear을 (세션 캐시로부터 모든 객체들을 완전하게 퇴거 호출하는) second-level 캐시의 경우 을 방법이 있습니다 인스턴스, 전체 클래스, 컬렉션 인스턴스 또는 전체 컬렉션 역할의 캐시 된 상태를 제거하기 위해 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 
+68

불쌍한 고양이 ... –

+6

첫 번째 매개 변수의 역할 이름은 전체 네임 스페이스 + Classname + Propertyname입니다. 퇴거. sessionFactory.GetAllCollectionMetaData(). Keys를 호출하여 캐시의 모든 것을 볼 수 있습니다. –

관련 문제